2015-12-14 35 views
8

Ho trovato una risposta molto buona a una domanda sulla costruzione di Albero dell'espressione per la query Where.Expression.Lambda e generazione di query in fase di esecuzione, proprietà nidificata "Dove" esempio

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

qualcuno può aiutarmi e farmi vedere come questo esempio potrebbe essere implementato nello scenario con la proprietà nidificato. Voglio dire, invece di:

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

Con questa soluzione:

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); 

Come posso costruire l'albero per la seguente?

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

Che cosa è 'Dati'? Specifica questa proprietà –

+0

Sergii grazie per l'aiuto. Alla fine lo risolvo - puoi controllarlo sotto aggiornamento. La seconda riga viene aggiunta e la terza viene modificata. –

risposta

0

(Questa risposta originariamente pubblicato dal PO in questione.)

Il problema può essere risolto con:

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

Questa è la stessa risposta inviata sopra, ma trovare questo più leggibile in termini di visualizzazione di un albero di espressioni:

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);