Question

Quel est le meilleur moyen d'écrire dynamiquement des requêtes LINQ et des expressions Lambda?

Je pense aux applications où l'utilisateur final peut concevoir des règles de logique métier, qui doivent ensuite être exécutées.

Je suis désolé si votre question concerne les débutants, mais il serait bon de tirer parti des meilleures pratiques de l'expérience.

Était-ce utile?

La solution

Je ne saurais trop vous recommander de lire les publications de Bart De Smet ( http: // community. bartdesmet.net/blogs/bart/ ), il est vraiment brillant quand il s'agit de Lambda.

Sa récente série portait sur Lambda dynamique, commençant par http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to -bind-dynamic-expression-trees-part-0.aspx

Code absolument magnifique.

Autres conseils

Une autre possibilité consiste à intégrer une exécution de script dans votre programme, afin que vos utilisateurs puissent écrire la logique métier dans un DSL. IronPython serait candidat.

Je peux voir deux façons de générer dynamiquement des lambda. Vous pouvez essayer Reflection.Emit pour générer directement IL (le bytecode .Net) et les appeler en tant que lambda ou vous pouvez utiliser System.CodeDom et Microsoft.CSharp.CSharpCodeProvider pour générer le code à partir de constructions de niveau supérieur. Ce que vous voulez faire dépend de la manière dont vous souhaitez que l'utilisateur saisisse ces informations. Si vous voulez que l'utilisateur écrive en C #, vous pouvez simplement utiliser le compliler intégré.

La génération dynamique de Linq devrait être plus facile. Vous devriez pouvoir générer des requêtes LINQ en tant qu’arbres d’expression au moment de l’exécution, puis les transmettre à un IQueryable à exécuter. Je vous suggère de consulter la documentation sur IQueryable pour en savoir plus à ce sujet. Une autre solution consisterait à prédéfinir quelques requêtes linq, puis à permettre à l'utilisateur de les chaîner. Cela devrait être réalisable car toute requête Linq renvoie un IEnumerable pouvant être utilisé par la prochaine requête Linq.

Les expressions lambda peuvent être facilement créées via l’espace de noms System.Linq.Expressions.

System.Linq.Expressions : c'est quoi vous avez besoin. J'ai écrit une belle interface utilisateur qui permet aux utilisateurs de définir et de créer des requêtes de manière dynamique sous la forme d'un arbre d'expression. Vous pouvez ensuite le transmettre à Linq2SQL ou au client de votre choix.

Je ne comprends pas ce que vous voulez dire par "meilleure façon". Il serait préférable de donner un exemple simple de ce que vous voulez réaliser. Composer une expression LINQ dynamique n'est pas difficile mais délicat.

Voici un exemple de création d’expression dynamique linq:

Comment composer des expressions Linq existantes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top