2015-12-14 7 views
8

Я нашел очень хороший ответ на вопрос о создании дерева выражений для запроса Where.Expression.Lambda и генерация запросов во время выполнения, вложенное свойство «Где» пример

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

Может кто-то помочь мне и показать мне, как этот пример может быть реализован в сценарии с вложенной собственности. Я имею в виду, вместо:

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"). 
+0

Что такое 'Данные'? Указать это свойство –

+0

Sergii благодарит за помощь. Я, наконец, разрешаю это - вы можете проверить его ниже обновления. Вторая строка добавлена, а третья - изменена. –

ответ

0

(Этот ответ был первоначально размещен на ОР в этом вопросе.)

Проблема может быть решена с помощью:

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

Это тот же ответ, как писал выше, но я найти это более читаемым с точки зрения визуализации дерева выражений:

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