Ric*_*ths 5 linq f# functional-programming odata type-providers
任何人都可以帮助我理解为什么下面的代码片段没有返回查询结果但第二个样本没有(虽然如果我尝试在第二个样本上使用标准,我会感到懊恼!)
type EbayData =
ODataService<"http://ebayodata.cloudapp.net">
let Ebay = EbayData.GetDataContext()
let Favourites title number = query{
for deal in Ebay.Deals do
where (deal.Title.Contains(title))
take number
}
let Esearch title number = [for item in Favourites title number do
yield item]
Run Code Online (Sandbox Code Playgroud)
工作版本:
type Catalog = ODataService< "http://ebayodata.cloudapp.net/" >
let ebay = Catalog.GetDataContext()
let trial =
[ for item in ebay.Deals do
yield item]
Run Code Online (Sandbox Code Playgroud)
我似乎无法输出第一个到任何类型的列表,无论用什么做什么等等.第二个示例似乎没有带来许多结果来进行文本查询.但是,我真正的问题是我似乎无法从F#版本的LINQ中获得任何东西.
输出用于WPF应用程序,我使用VB与列表进行通信.我用它填充了一个没有区别的10个项目列表,这样就可以了.这是VB代码.
For Each Deal In trial.Where(Function(p) p.Title.Contains(title.Text))
DealResults.Items.Add(buildStackPanel(Deal))
Next
Run Code Online (Sandbox Code Playgroud)
当我按下Ctrl-K时,这个帖子上F Sharp的间距似乎不起作用,所以如果有人能告诉我我做错了什么 - 我猜这是第二个问题!
我不知道为什么这不适合你.我淘汰了以下内容似乎有效:
open Microsoft.FSharp.Data
type Catalog = TypeProviders.ODataService< "http://ebayodata.cloudapp.net/" >
let ebay = Catalog.GetDataContext()
let trial =
[ for item in ebay.Deals do
yield item]
let trial2 = query {
for deal in ebay.Deals do
where (deal.Title.Contains "a")
take 2
}
let ESearch title number =
query {
for deal in ebay.Deals do
where (deal.Title.Contains title)
take number
}
[<EntryPoint>]
let main argv =
trial |> Seq.take 2 |> Seq.iter (fun d -> printfn "%s" d.Title)
trial2 |> Seq.iter (fun d -> printfn "%s" d.Title)
ESearch "a" 2 |> Seq.iter (fun d -> printfn "%s" d.Title)
0
Run Code Online (Sandbox Code Playgroud)
也许你试过搜索不存在的东西?目前只有6笔交易,所以这不太可能.
查询项目
在这里阅读有关eBay OData服务的信息:http://ebayodata.cloudapp.net/docs 查询项目时有特殊需求:
(需要使用Seller,PrimaryCategoryId或SecondaryCategoryId搜索参数或$ filter)
因此,要查询项目,您需要至少提供一个搜索短语.您的where声明未转换为最终网址中的搜索参数.要在此类型提供程序中添加自定义参数,请执行.AddQueryOption.
let ItemSearch title number =
query {
for item in ebay.Items
.AddQueryOption("search", title) do
take number
}
// use
ItemSearch "wario" 2 |> Seq.iter (fun d -> printfn "%s" d.Title)
Run Code Online (Sandbox Code Playgroud)