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);
Другие вопросы по тегам