私はF#とLinqをUDFのために使用しようとしていて、SQLサーバにprocsを保存しようとしているプロジェクトに取り組んでいます。 その一部は、すべての有効なクエリ、並べ替え基準、およびクエリの結果をスコアリングする手段を静的に定義することでした。linqクエリで多くの引用を構成しています
これまではかなり成功しましたが、私はsortBy式を構成することに深刻な困難を抱いています。
はここでこれはとても
let execQuery = fun (predicates,sorts,scorer) ->
<@ seq { for prod in (%dc).Products do
if (%predicates) prod then yield prod }
|> (%sorts)
|> (%scorer) @>
これらの基本的なアウトラインを使用するようにクエリエグゼキュータの後半で使用されてしまうの基本的な考え方
let sorter =
let exprMap:Map<string,Quotations.Expr<seq<Product> -> seq<Product>>> =
Map.ofList
["ProductName",<@ Seq.sortBy (fun prod -> prod.Name) @> ]
// .. more entries ..
let sortBuilder sortkeys =
Array.foldBack
(fun criteria acc -> <@ %(exprMap.[criteria]) >> (%acc) @>)
sortkeys
<@ Seq.map id @>
だ、すべてがいる限り、私は(使用しないように動作します%ソート)。私がそれを渡すたびに、Linqの翻訳者にF#で認識されません。私はコンビネータを使用する際にさまざまな試みを試みましたが、私は何かが欠けているという感覚を持っています。
<@ Seq.sortBy (fun prod -> prod.Name) |> Seq.sortBy (fun prod -> prod.Style) @>
これは、次のようにソーター機能をスタブアウトすると正常に動作します。しかし、このようにコンビネータを使用して:
let (|>*) = fun f g -> <@ fun c -> ((%f) c) |> (%g) @>
にはない..
任意のアイデア?