2016-04-11 14 views
6

これは別のものですaccessing dynamic objects in F#私はlet y = x.Where(fun x -> x.City ="London").Select("new(City,Zip)")を使用してクエリをパラメータ化し、必要な項目を抽出しています。これらはSQLクエリの列に対応し、datacontextのプロパティで表されます。これは私がパラメータとして渡したい部分です。パラメトリック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)} 

基本的に私はxx.*ないだけで合格したいと思います。固定されている1つのデータベースにアクセスしているので、xを除外することができます。しかし、今私は40の小さな関数は、異なる列を抽出している。それを1つの関数に因数分解し、その引数を引数として渡すことは可能ですか?だから時々、私はx.Cityを抽出しますが、他の時はx.Countryです。私は引用符を使用しようとしましたが、適切にスプライスすることはできませんし、それは正しいアプローチではないかもしれません。引用スプライシングについて

+0

私はあなただけのようにタプルを受け入れる '選択(顧客、customer.City)'とあなたの 'qryfun'ようなクエリからのタプルを返すことができると思いますパラメータ さまざまな顧客プロパティには静的型がないため、関数/変換間の中間データフローにタプルを使用するか、独自のレコード型を定義してクエリにマッピングします。 – paulik

+0

@paulik thx。私はそれが実行可能であるかどうかはわかりません。例えば。 'x 'はDBテーブル(Northwind.ServiceTypes.Customer)であり、x.columnはColumn(またはフィールド)です。 )Customerテーブル内では、x.City、x.Countryなどとなります。次に 'qryfun(Northwind.ServiceTypes.Customer、Northwind.ServiceTypes.Customer.City) 'を呼び出します。第2引数は扱いにくいNorthwind.ServiceTypes.Customer.Cityは、テーブルにない各レコードに属します。参照された質問を見てみると、私は文字列( "new(City、Country)"からそれをbultします) – s952163

答えて

7

が、これは私の作品:

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

これは黒い魔法です:-)はい、確かに、これは非常にきちんとした解決策です。ありがとうございました! – s952163