Ho trovato una risposta molto bella a una domanda sulla creazione di un albero di espressione per la query Where.
Expression.Lambda e generazione di query in fase di runtime, l'esempio "Where" più semplice
Qualcuno può aiutarmi e mostrarmi come questo esempio potrebbe essere implementato nello scenario con proprietà annidate. Intendo invece di:
var result = query.Where(item => item.Name == "Soap")
Con quella 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 il seguente?
var result = query.Where(item => item.Data.Name == "Soap").
(Questa risposta è stata originariamente pubblicata dall'OP nella domanda).
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);
Questa è la stessa risposta che ho postato sopra, ma trovo ciò 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);