我正在做一个项目,我正在尝试将 F# 和 Linq 用于 UDF,并将过程存储在 SQL 服务器中。其中一部分是静态定义所有有效查询、排序标准以及对查询结果进行评分的方法。
到目前为止,我已经相当成功,但是我在编写 sortBy 表达式时遇到了严重的困难。
这是基本概念
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 @>
这最终会像这样在查询执行器中使用
let execQuery = fun (predicates,sorts,scorer) ->
<@ seq { for prod in (%dc).Products do
if (%predicates) prod then yield prod }
|> (%sorts)
|> (%scorer) @>
使用这些基本轮廓,只要我不使用 (%sorts),一切都可以正常工作。每次我传递它时,我都不会在 F# 到 Linq 翻译器中被识别。我已经尝试了许多使用组合器的不同尝试,但我觉得我错过了一些东西。如果我使用以下内容排除排序器功能
<@ Seq.sortBy (fun prod -> prod.Name) |> Seq.sortBy (fun prod -> prod.Style) @>
它按预期工作。但是使用这样的组合器:
let (|>*) = fun f g -> <@ fun c -> ((%f) c) |> (%g) @>
才不是..
有任何想法吗?