5

谁能帮我理解为什么下面的代码没有从查询中返回结果,而第二个示例却没有(尽管如果我尝试在第二个示例上使用标准,我会很痛苦!)

 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]

工作版本:

type Catalog = ODataService< "http://ebayodata.cloudapp.net/" >

let ebay = Catalog.GetDataContext()

let trial =
            [ for item in ebay.Deals do
               yield item]

我似乎无法将第一个输出到任何类型的列表,无论使用 |> 等做什么。第二个示例似乎并没有带回许多结果来进行文本查询。但是,我真正的问题是我似乎无法从 F# 版本的 LINQ 中得到任何东西。

输出用于我使用 VB 与列表对话的 WPF 应用程序中。我已经用它填充了一个包含 10 个项目的非歧视性列表,所以这个结果确实有效。这是VB代码。

 For Each Deal In trial.Where(Function(p) p.Title.Contains(title.Text))
                DealResults.Items.Add(buildStackPanel(Deal))
            Next

当我按下 Ctrl-K 时,这篇文章中 F Sharp 的间距似乎不起作用,所以如果有人能告诉我我做错了什么——我想这是第二个问题!

4

1 回答 1

5

我不知道为什么这对你不起作用。我敲掉了以下,它似乎工作:

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

也许您尝试搜索不存在的东西?目前只有 6 笔交易,所以这并非不可能。

查询项目

在此处阅读有关 eBay OData 服务的信息:http: //ebayodata.cloudapp.net/docs 它在查询商品时有特殊需求:

(需要使用卖家、PrimaryCategoryId 或 SecondaryCategoryId 的搜索参数或 $filter)

因此,要查询项目,您至少需要提供一个搜索词组。您的where陈述不会被翻译成最终 url 中的搜索参数。要在此类型提供程序中添加自定义参数,请执行.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)
于 2012-12-04T09:22:50.650 回答