2016-04-11 18 views
6

To jest kolejne podejście do accessing dynamic objects in F#. Używam let y = x.Where(fun x -> x.City ="London").Select("new(City,Zip)") do parametryzowania zapytania i wyodrębniania niezbędnych elementów. Będą one odpowiadać kolumnom w zapytaniu SQL i będą reprezentowane przez właściwość datacontext. Jest to część, którą chciałbym przekazać jako parametr.Parametryczne zapytanie LINQ

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)} 

Zasadniczo chciałbym przejść w nie tylko x ale także x.*. Kiedy uzyskuję dostęp do jednej bazy danych, która jest poprawiona, mogę wziąć pod uwagę x. Jednak teraz mam 40 małych funkcji wyodrębniających różne kolumny. Czy można to zrekompensować do jednej funkcji i przekazać właściwość jako argument? Więc czasami wyodrębniam x.City, ale innym razem x.Country. Próbowałem używać cytatów, ale nie mogę ich poprawnie spliczyć i być może nie jest to właściwe podejście.

+0

myślę, że można po prostu wrócić krotki z kwerendy jak 'select (klienta, customer.City)' 'qryfun' i swojej akceptuje krotki postaci Parametr Ponieważ wszystkie różnorodne właściwości klienta nie mają typu statycznego, można użyć krotek dla pośredniego przepływu danych między funkcjami/transformacjami lub zdefiniować własny typ rekordu i odwzorować go w zapytaniu – paulik

+0

@paulik thx. Nie jestem pewien, czy jest to wykonalne. Na przykład. 'let qryfun (x, x.column) = zapytanie {dla x w zapytaniu2 do select (x.column)}' gdzie x to tabela DB (Northwind.ServiceTypes.Customer) a x.column to kolumna (lub pole) w tabeli Customer może to być x.City, x.Country, etc .... wtedy nazywam 'qryfun (Northwind.ServiceTypes.Customer, Northwind.ServiceTypes.Customer.City)' Drugi argument jest trudny, ponieważ Northwind.ServiceTypes.Customer.City należy do każdego rekordu nie do stołu. Jeśli spojrzysz na zadane przeze mnie pytanie, zbieram je z ciągu ("nowy (miasto, kraj)") – s952163

Odpowiedz

7

chodzi notowań składania, to działa na mnie:

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

to jest czarna magia :-) tak, rzeczywiście, jest to bardzo miłe rozwiązanie. Dziękuję Ci! – s952163

Powiązane problemy