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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top