Comporre molte citazioni nelle query Linq
-
12-11-2019 - |
Domanda
Sto lavorando a un progetto in cui sto cercando di utilizzare F# e LINQ per UDF e PROCS archiviati in un server SQL. Parte di ciò è stato quello di definire staticamente tutte le query valide, i criteri di smistamento e un mezzo per segnare i risultati delle domande.
Finora ho avuto abbastanza successo, ma mi imbatto in seria difficoltà a comporre espressioni di Sortby.
Ecco il concetto di base
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 @>
Questo finisce per essere usato più avanti nell'esecutore di query così
let execQuery = fun (predicates,sorts,scorer) ->
<@ seq { for prod in (%dc).Products do
if (%predicates) prod then yield prod }
|> (%sorts)
|> (%scorer) @>
Usando questi contorni di base, tutto funziona fintanto che non uso (%TORME). Ogni volta che lo trasmetto, non vengo riconosciuto in F# a Linq Translator. Ho provato diversi tentativi di usare i combinatori, ma ho la sensazione che mi manca qualcosa. Se lo faccio scoppiare la funzione di Strere con quanto segue
<@ Seq.sortBy (fun prod -> prod.Name) |> Seq.sortBy (fun prod -> prod.Style) @>
Funziona come previsto. Tuttavia, usando un combinatori come questo:
let (|>*) = fun f g -> <@ fun c -> ((%f) c) |> (%g) @>
non..
Qualche idea?
Nessuna soluzione corretta