j'ai donc une énorme requête EntityFramework avec EntityFramework, mais de rester simple ici un petit exemple:C# opérateurs dynamiques dans LINQ Expression pour EntityFramework
var amount = 10;
myArticles.GroupBy(p => p.Id)
.Where(grp => grp.Sum(k => k.Amount) > amount
Selon certains paramètres que j'ai < amount
ou == amount
.
Bien sûr, je ne veux pas écrire toujours toute requête à nouveau, donc je suis venu avec ceci:
Expression<Func<IGrouping<MyEntity, MyXy>, bool>> whereClause;
puis en fonction des paramètres d'entrée par exemple:
whereClause = grp => grp.Sum(k => k.Amount) > amount;
myArticles.GroupBy(p => p.Id)
.Where(whereClause);
maintenant à la question: Est-il possible de rendre l'opérateur dynamique avec Expressions? Ce que je veux écrire quelque chose comme ceci:
Expression<Func<decimal, int, bool>> operatorExpression = (arg1, arg2) => arg1 == arg2;
whereClause = grp => operatorExpression.Invoke(grp.Sum(k => k.Amount), amount);
Je suis conscient qu'il ya LinqKit, mais je veux vraiment savoir s'il est possible de résoudre ce juste en utilisant des arbres d'expression et de la façon dont il est complexe. Je ne veux pas faire un Func hors de l'opérateurexpression car le résultat devrait être calculé sur le SQL Server, pas en mémoire.
Si, en utilisant simplement Expression Trees *, vous voulez dire des expressions de temps de compilation en C# pur sans helpers de traitement d'expression personnalisés (comme LINQKit ou similaire), non, ce n'est pas possible. Recherchez SO pour * "composer expression" * et vous trouverez de nombreux exemples applicables à votre cas simple. –
Vous demandez essentiellement à quel point il serait difficile de réimplémenter LINQKit. Pourquoi ne regardez-vous pas son code source et décidez vous-même? – svick