2016-04-11 14 views
6

Questa è un'altra operazione su accessing dynamic objects in F# Lì sto utilizzando let y = x.Where(fun x -> x.City ="London").Select("new(City,Zip)") per parametrizzare la query ed estrarre gli elementi necessari. Questi corrisponderebbero alle colonne in una query SQL e sarebbero rappresentati da una proprietà del datacontext. Questa è la parte che vorrei passare come parametro.query LINQ parametrica

type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc"> 
let db = Northwind.GetDataContext() 
let query2 = query { for customer in db.Customers do 
        select customer} |> Seq.toArray 
let qryfun (x:Northwind.ServiceTypes.Customer) = 
    query { for x in query2 do 
      select (x.City,x.CompanyName,x.Country)} 

Fondamentalmente desidero passare non solo x ma anche x.*. Mentre accedo a un database corretto, posso calcolare x. Tuttavia ora ho 40 piccole funzioni che estraggono le diverse colonne. È possibile calcolarlo su una funzione e passare la proprietà come argomento? Quindi a volte estraggo x.City ma altre volte x.Country. Ho provato a utilizzare le citazioni, tuttavia non è possibile giuntarle correttamente e forse questo non è l'approccio giusto.

+0

Penso che si può solo tornare tuple dalla query come 'selezionare (cliente, customer.City)' e 'la tua qryfun' accetterà tuple come parametro Poiché tutte le varietà di proprietà del cliente non hanno il tipo statico, si utilizzano tuple per il flusso di dati intermedi tra funzioni/trasformazioni o si definisce il proprio tipo di record e lo si mappa nella query – paulik

+0

@paulik thx. Non sono sicuro che sia fattibile. Per esempio. 'lascia qryfun (x, x.column) = query {per x in query2 do select (x.column)}' dove x è la tabella DB (Northwind.ServiceTypes.Customer) e x.column è una colonna (o campo) nella tabella Clienti, potrebbe essere x.City, x.Country, ecc .... quindi chiamerei 'qryfun (Northwind.ServiceTypes.Customer, Northwind.ServiceTypes.Customer.City)' Il secondo argomento è difficile perché Northwind.ServiceTypes.Customer.City appartiene a ciascun record non alla tabella. Se dai un'occhiata alla domanda di riferimento, la bulto da una stringa ("nuovo (Città, Paese)") – s952163

risposta

7

Per quanto riguarda la quotazione tranciati, questo funziona per me:

open System.Linq 

type record = { x:int; y:string } 

let mkQuery q = 
    query { 
     for x in [{x=1;y="test"}].AsQueryable() do 
     select ((%q) x) 
    } 

mkQuery <@ fun r -> r.x, r.y @> 
|> Seq.iter (printfn "%A") 
+0

questa è magia nera :-) Sì, davvero, questa è una soluzione molto accurata. grazie! – s952163