Expression.Lambda et génération de requête au moment de l'exécution, propriété imbriquée «Where», exemple

c# dynamic-language-runtime expression-trees lambda

Question

J'ai trouvé une très bonne réponse à une question sur la création d'Expression Tree pour la requête Where.

Expression.Lambda et génération de requête au moment de l'exécution, le plus simple exemple "Where"

Quelqu'un peut-il m'aider et me montrer comment cet exemple pourrait être implémenté dans le scénario avec propriété imbriquée. Je veux dire au lieu de:

var result = query.Where(item => item.Name == "Soap")

Avec cette solution:

var item = Expression.Parameter(typeof(Item), "item");

var prop = Expression.Property(item, "Name");

var soap = Expression.Constant("Soap");

var equal = Expression.Equal(prop, soap);

var lambda = Expression.Lambda<Func<Item, bool>>(equal, item);

var result = queryableData.Where(lambda);

Comment puis-je construire l'arbre pour ce qui suit?

var result = query.Where(item => item.Data.Name == "Soap").

Réponse acceptée

(Cette réponse a été initialement publiée par le PO dans la question.)

Le problème peut être résolu avec:

var item = Expression.Parameter(typeof(Item), "item");

var dataExpr = Expression.Property(item, "Data");

var prop = Expression.Property(dataExpr, "Name");

var soap = Expression.Constant("Soap");

var equal = Expression.Equal(prop, soap);

var lambda = Expression.Lambda<Func<Item, bool>>(equal, item);

var result = queryableData.Where(lambda);

Réponse populaire

C'est la même réponse que celle affichée ci-dessus, mais je trouve cela plus lisible en termes de visualisation d'un arbre d'expression:

var parameterItem = Expression.Parameter(typeof(Item), "item");

var lambda = Expression.Lambda<Func<Item, bool>>(
    Expression.Equal(
        Expression.Property(
            Expression.Property(
                parameterItem, 
                "Data"
            ), 
            "Name"
        ), 
        Expression.Constant("Soap")
    ), 
    parameterItem
);

var result = queryableData.Where(lambda);


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