Я работаю над проектом, в котором я пытаюсь использовать F # и Linq для UDF и хранимых процессов на SQL-сервере. Часть из них заключалась в том, чтобы статически определять все допустимые запросы, критерии сортировки и средство подсчета результатов запросов.составление многих цитат в запросы linq
Я до сих пор был довольно успешным, но у меня возникают серьезные трудности с составлением 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) @>
Используя эти основные контуры, все работает до тех пор, пока я не использовать (% сорта). Каждый раз, когда я пропускаю это, я не распознаю в F # переводчика Linq. Я пробовал несколько разных попыток использовать комбинаторы, но у меня есть смысл, что я чего-то не хватает. Если я отключу функцию сортировщика следующим образом:
<@ Seq.sortBy (fun prod -> prod.Name) |> Seq.sortBy (fun prod -> prod.Style) @>
Работает должным образом. Однако с помощью комбинатора, как это:
let (|>*) = fun f g -> <@ fun c -> ((%f) c) |> (%g) @>
не ..
Есть идеи?