Expression.Lambda и генерация запроса во время выполнения, пример вложенного свойства "Где"
Я нашел очень хороший ответ на вопрос о построении дерева выражений для запроса "Где".
Expression.Lambda и генерация запросов во время выполнения, самый простой пример "Где"
Может кто-нибудь помочь мне и показать, как этот пример может быть реализован в сценарии с вложенным свойством. Я имею в виду вместо:
var result = query.Where(item => item.Name == "Soap")
С этим решением:
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);
Как я могу построить дерево для следующего?
var result = query.Where(item => item.Data.Name == "Soap").
2 ответа
Решение
(Этот ответ был первоначально опубликован ФП в вопросе.)
Проблема может быть решена с помощью:
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);
Это тот же ответ, который был опубликован выше, но я считаю его более читабельным с точки зрения визуализации дерева выражений:
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);