2012-12-04 9 views
5

Qualcuno può aiutarmi a capire perché il codice riportato di seguito non restituisce risultati dalla query, ma il secondo campione lo fa (anche se guai se cerco di utilizzare i criteri sul secondo)EBay OData Provider di tipo in F # e senza risultati con LINQ

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] 

la versione di lavoro:

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

let ebay = Catalog.GetDataContext() 

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

io non riesco a emettere il primo a qualsiasi tipo di lista, non importa cosa fare con |> ecc il secondo campione doesn! Sembra che riportino molti resuls per fare una richiesta di testo. Tuttavia, il mio vero problema è che non riesco a ottenere nulla di LINQ in versione F #.

L'uscita viene utilizzata in un'applicazione WPF in cui utilizzo VB per parlare all'elenco. Ho compilato un elenco non discriminato di 10 elementi con esso, in modo che la fine funzioni. Questo è il codice VB.

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

La distanza per l'F Sharp su questo post non sembra funzionare quando ho colpito Ctrl-K per cui se qualcuno può dirmi che cosa sto facendo male - Direi che è una seconda domanda!

risposta

5

Non so perché questo non funziona per voi. Ho eliminato quanto segue e sembra funzionare:

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 

Forse hai provato a cercare cose che non esistono? Al momento ci sono solo 6 offerte, quindi non è improbabile.

Articoli Interrogazione

leggere circa il servizio eBay OData qui: http://ebayodata.cloudapp.net/docs Ha esigenze particolari durante la ricerca di Articoli:

(parametro di ricerca o $ filtrare con il venditore, PrimaryCategoryId o SecondaryCategoryId è richiesto)

Quindi per richiedere gli articoli, è necessario fornire a almeno una frase di ricerca. L'istruzione where non viene convertita in un parametro di ricerca nell'URL finale. Per aggiungere parametri personalizzati in questo Provider di tipi, devi eseguire .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) 
+0

Posso capire perché. Andando a segnare questa risposta quando torno a casa per eseguirlo :). deal.Title.Contains "a" - la mia sintassi è una schifezza. Grazie mille! –

+0

Ciao @Robert Jeppesen, ho avuto la possibilità di provare questo. Il tuo codice funziona perfettamente. Che cosa non funziona è il mio adattamento di questo codice: 'Codice delle lasciare EItemSearch documento Numero = interrogazione { per elemento in ebay.Items fare dove (item.Title.Contains titolo) introito numero } –

+0

Né mia gestione della formattazione mini markdown! –

Problemi correlati