construit manuellement l'expression linq pour x => x.Child == itemToCompare.Child

expression-trees lambda linq

Question

Nous avons un objet et nous voulons construire une requête linq basée sur cet objet à la volée. Cette instruction linq est équivalente à ce que nous voulons construire:

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

Nous ne pouvons pas tout à fait trouver la bonne expression pour construire la partie itemToCompare.Child. Voici ce que nous avons jusqu'à présent:

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

L'arbre d'expression de notre requête construite à la main se présente comme suit:

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

L'arbre d'expression pour le lambda actuel ressemble à ceci:

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

Modifier:

Nous pensons que cela fonctionne pour

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

c'est ce que nous essayons de reproduire dans notre expression.

En fin de compte, l'objectif est de produire une expression dans laquelle les valeurs de l'enfant sont comparées à l'aide de la méthode .Equals () de leur type.

Merci!

Réponse acceptée

Vous êtes confus par le "lambda intérieur". Il n'y a qu'une seule expression lambda:

var param = Expression.Parameter(typeof(Sample), "x");
var key = itemToCompare.GetType().GetProperty("Child");
var rhs = Expression.MakeMemberAccess(Expression.Constant(itemToCompare), key);
var lhs = Expression.MakeMemberAccess(param, key);
var body = Expression.Equal(lhs, rhs);
var lambda = Expression.Lambda<Func<Sample, bool>>(body, param);



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi