2016-04-11 29 views
6

Bu başka bir accessing dynamic objects in F# almaktır. Sorguyu parametrize etmek ve gerekli öğeleri ayıklamak için let y = x.Where(fun x -> x.City ="London").Select("new(City,Zip)") kullanıyorum. Bunlar, bir SQL sorgusundaki sütunlara karşılık gelir ve datacontext'in bir özelliği tarafından temsil edilir. Bu parametre olarak geçmek istediğim kısım.Parametrik LINQ sorgusu

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

Temelde ben sadece x aynı zamanda x.* geçmek istiyoruz. Sabit olan bir veritabanına erişirken, x'i katlayabilirim. Ancak şimdi farklı sütunları ayıklayan 40 küçük fonksiyon var. Tek bir işlev için onu hesaba katmak ve özelliği bir argüman olarak iletmek mümkün mü? Yani bazen x.City'u ancak diğer zamanlarda x.Country'u çıkarırım. Teklifleri kullanmayı denedim, ancak doğru şekilde ekleyemiyorum ve belki de bu doğru bir yaklaşım değil. tırnak ekleme İlişkin

+0

Ben sadece bir olarak başlığın kabul edecek 'seçmek (müşteri, customer.City)' ve 'qryfun' gibi sorgudan tuple döndürmek düşünüyorum parametre Tüm müşteri özelliklerinin statik türü olmadığından, işlevler/dönüştürmeler arasında ara veri akışı için tupller kullanırsınız veya kendi kayıt türünüzü tanımlayın ve sorgunuzda – paulik

+0

@paulik thx ile eşleyin. Yapılabileceğinden emin değilim. Örneğin. 'qryfun (x, x.column) = sorgu {sorgu2'de x için seçin (x.column)}' burada x DB tablosu (Northwind.ServiceTypes.Customer) ve x.column bir sütun (veya alan) Müşteri tablosunda, x.City, x.Country, vb .... olabilirdi o zaman ben "qryfun (Northwind.ServiceTypes.Customer, Northwind.ServiceTypes.Customer.City)" diyebilirim çünkü 2. argüman zor Northwind.ServiceTypes.Customer.City tabloya değil her kayıta aittir. Başvurulan soruya bakarsanız, bir dizgeden ("yeni (Şehir, Ülke)") – s952163

cevap

7

, bu benim için çalışıyor:

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

bu kara büyü :-) olduğunu, evet, gerçekten, bu çok temiz bir çözüm. teşekkür ederim! – s952163