2015-12-14 5 views
8

J'ai trouvé très belle réponse à une question sur la construction de l'arbre d'expression pour la requête Where.Expression.Lambda et la génération de requêtes à l'exécution, la propriété imbriquée "Où" exemple

Expression.Lambda and query generation at runtime, simplest "Where" example

quelqu'un peut me aider et me montrer comment cet exemple pourrait être mis en œuvre dans le scénario avec la propriété imbriqué. 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"). 
+0

Qu'est-ce que 'Data'? Précisez cette propriété –

+0

Sergii vous remercie pour l'aide. Je résous finalement cela - vous pouvez le vérifier ci-dessous mise à jour. La deuxième ligne est ajoutée et la troisième est modifiée. –

Répondre

0

(Cette réponse a été publiée par l'OP 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); 
1

Ceci est la même réponse que diffusée ci-dessus, mais je trouvez ceci 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);