2008-09-22 19 views
14

Qual è il modo migliore di scrivere dinamicamente le query LINQ e le espressioni Lambda?Espressioni dinamiche LINQ e Lambda dinamica?

Penso a applicazioni in cui l'utente finale può progettare regole di business logic, che devono essere quindi eseguite.

Mi dispiace se si tratta di una domanda per principianti, ma sarebbe bello ottenere le migliori pratiche dall'esperienza.

risposta

1

Sono in grado di vedere due modi per generare dinamicamente lambda. Si potrebbe provare Reflection.Emit per generare direttamente IL (bytecode .Net) e chiamarli come lambda oppure utilizzare System.CodeDom e Microsoft.CSharp.CSharpCodeProvider per generare il codice da costrutti di livello superiore. Quello che vuoi fare dipende da come vuoi che l'utente inserisca questa roba. Se vuoi che l'utente scriva C#, puoi semplicemente usare il complatore incorporato.

Generare Linq in modo dinamico dovrebbe essere più semplice. Dovresti essere in grado di generare query LINQ come alberi di espressioni in runtime e poi passarle in un IQueryable da eseguire. Ti suggerirei di consultare la documentazione su IQueryable per saperne di più. Un altro modo sarebbe quello di pre-definire un paio di query linq e quindi consentire all'utente di concatenarle. Ciò dovrebbe essere possibile perché qualsiasi query Linq restituisce un oggetto IEnumerable che può essere utilizzato dalla successiva query Linq.

2

Un'altra possibilità è integrare un runtime di script nel programma, in modo che gli utenti possano scrivere la logica di business in un DSL. IronPython sarebbe un candidato.

+0

Consiglio sonoro. Lo abbiamo fatto per la configurazione dei flussi di lavoro e funziona abbastanza bene. –

+0

l'unico svantaggio è che potresti incorrere in problemi con trust pieno/parziale che impedirebbero l'esecuzione del codice in asp.net – viggity

+0

questa è una possibilità, ma non è una risposta alla mia domanda ... – Sklivvz

-1

Non capisco cosa intendi dire "miglior modo". Sarebbe meglio fornire un semplice esempio di ciò che si vuole ottenere. La composizione dell'espressione LINQ dinamica non è difficile ma difficile.

Ecco un esempio di creazione espressione LINQ dinamica:

How do I compose existing Linq Expressions

+0

Aku, se è difficile allora ci sono sicuramente le migliori pratiche? – Sklivvz

+1

Non conosco le "migliori pratiche" per queste cose. So come risolvere il problema concreto, ma il "modo migliore" generale è una questione troppo vaga. – aku

0

lambda espressioni possono essere facilmente creati tramite lo spazio dei nomi System.Linq.Expressions.

0

System.Linq.Expressions è quello che ti serve. Ho scritto una bella interfaccia utente che consente agli utenti di definire e creare query in modo dinamico sotto forma di un albero di espressioni. È quindi possibile consegnarlo a Linq2SQL o client di propria scelta.