Linq Join avec une expression dynamique
-
21-12-2019 - |
Question
J'essaie de faire une jointure dynamique dans Linq.Cela signifie que je sais seulement au moment de l'exécution sur quel champ la jointure se produira.
J'ai fait ce qui suit :
var itemParam = Expression.Parameter(typeof(E), "obj");
var entityAccess = Expression.MakeMemberAccess(Expression.Parameter(typeof(E), "obj"), typeof(E).GetMember(Field).First());
var lambda = Expression.Lambda(entityAccess, itemParam);
var q = dbSet.Join(context.Acl, lambda, acl => acl.ObjectID, (entity, acl) => new { Entity = entity, ACL = acl });
Cependant, cela se lance au moment de la compilation, même si lambda semble être la bonne syntaxe me disant qu'il ne peut pas convertir de LambdaExpression en Expression<System.Func<E, int>>
.
Comment puis-je faire en sorte qu'il crée dynamiquement la bonne expression qui utilise mon champ (c'est-à-direpropriété "Champ" ci-dessus dans le typeof(E).GetMember(Field).First())
doubler?
La solution
Utiliser Expression.Lambda<TDelegate>
, pour que vous vous retrouviez avec la ligne
// obj => obj.Field
var lambda = Expression.Lambda<Func<E, int>>(entityAccess, itemParam);
Mise à jour
Selon votre commentaire, la raison pour laquelle l'expression échoue est que vous utilisez deux paramètres différents.Vous définissez itemParam
, mais ne l'utilisez pas dans Expression.MakeMemberAccess
Essayez plutôt ce qui suit :
// obj
var itemParam = Expression.Parameter(typeof(E), "obj");
// obj.Field
var entityAccess = Expression.MakeMemberAccess(itemParam, typeof(E).GetMember(Field).First());