Domanda

Qual è il modo migliore per scrivere dinamicamente query LINQ ed espressioni Lambda?

Sto pensando ad applicazioni in cui l'utente finale può progettare regole di logica aziendale, che devono quindi essere eseguite.

Mi dispiace se si tratta di una domanda da principiante, ma sarebbe bello mettere fuori uso le migliori pratiche.

È stato utile?

Soluzione

Non posso raccomandare di meglio di te che leggi i post di Bart De Smet ( http: // community. bartdesmet.net/blogs/bart/ ), è davvero brillante quando si tratta di Lambda.

La sua serie recente ha riguardato Lambda dinamica, iniziando con http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to -bind-dynamic-espressione-alberi-parte-0.aspx

Codice assolutamente bello.

Altri suggerimenti

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

Vedo due modi in cui puoi generare dinamicamente lambda. È possibile provare Reflection.Emit per generare direttamente IL (il bytecode .Net) e chiamarli come lambda oppure è possibile 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 queste cose. Se vuoi che l'utente scriva C #, puoi semplicemente usare il compilatore integrato.

La generazione dinamica di Linq dovrebbe essere più semplice. Dovresti essere in grado di generare query LINQ come alberi delle espressioni in fase di esecuzione e quindi passarle in un IQueryable per l'esecuzione. Ti suggerirei di consultare la documentazione su IQueryable per saperne di più su questo. Un altro modo sarebbe pre-definire un paio di query linq e quindi consentire all'utente di metterle insieme. Questo dovrebbe essere praticabile perché qualsiasi query Linq restituisce un IEnumerable che può essere utilizzato dalla successiva query Linq.

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

System.Linq.Expressions è ciò che hai bisogno. 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. Puoi quindi consegnarlo a Linq2SQL o al client di tua scelta.

Non capisco cosa intendi dire "il modo migliore". Sarebbe meglio fornire un semplice esempio di ciò che si desidera ottenere. Comporre un'espressione LINQ dinamica non è difficile ma difficile.

Ecco un esempio di creazione dinamica di espressioni linq:

Come compongo le espressioni Linq esistenti

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