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?

Était-ce utile?

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());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top