2016-04-11 13 views
6

Dies ist eine andere Einstellung auf accessing dynamic objects in F# Dort verwende ich , um die Abfrage zu parametrisieren und die erforderlichen Elemente zu extrahieren. Diese würden Spalten in einer SQL-Abfrage entsprechen und durch eine Eigenschaft des Datenkontexts dargestellt werden. Dies ist der Teil, den ich als Parameter übergeben möchte.Parametrische LINQ-Abfrage

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

Grundsätzlich würde Ich mag nicht nur x passieren, sondern auch x.*. Wenn ich auf eine Datenbank zugreife, die fest ist, kann ich x ausrechnen. Allerdings habe ich jetzt 40 kleine Funktionen, die die verschiedenen Spalten extrahieren. Ist es möglich, es auf eine Funktion auszuweiten und die Eigenschaft als Argument zu übergeben? Also manchmal extrahiere ich x.City aber andere Male x.Country. Ich habe versucht, Zitate zu verwenden, aber kann es nicht richtig spleißen und vielleicht ist das nicht der richtige Ansatz.

+0

Ich glaube, Sie nur Tupel aus der Abfrage wie 'wählen (Kunde, customer.City)' und 'Ihr qryfun' Tupel als akzeptiert zurückkehren Parameter Da alle Arten von Kundeneigenschaften keinen statischen Typ haben, verwenden Sie entweder Tupel für den intermediären Datenfluss zwischen Funktionen/Transformationen oder definieren Ihren eigenen Datensatztyp und ordnen ihn in Ihrer Abfrage – paulik

+0

@paulik thx zu. Ich bin mir nicht sicher, ob das machbar ist. Z.B. 'late qryfun (x, x.column) = Abfrage {für x in query2 do select (x.column)}' wobei x die DB-Tabelle (Northwind.ServiceTypes.Customer) und x.column eine Spalte (oder ein Feld) ist) in der Customer-Tabelle könnte es x.City, x.Country, etc .... dann würde ich 'qryfun (Northwind.ServiceTypes.Customer, Northwind.ServiceTypes.Customer.City)' 'Das 2. Argument ist knifflig weil Northwind.ServiceTypes.Customer.City gehört zu jedem Datensatz, der nicht zu der Tabelle gehört. Wenn Sie sich die referenzierte Frage ansehen, bult ich sie aus einer Zeichenkette ("neu (Stadt, Land)") – s952163

Antwort

7

Bezüglich Zitat Spleißen, das funktioniert für mich:

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

das ist schwarze Magie :-) Ja, das ist wirklich eine sehr saubere Lösung. Danke! – s952163

Verwandte Themen