2015-12-14 27 views
8

Tôi đã tìm thấy câu trả lời rất hay về một câu hỏi về việc xây dựng Tree Expression cho truy vấn Where.Expression.Lambda và tạo truy vấn trong thời gian chạy, thuộc tính lồng nhau “Where” example

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

Ai đó có thể giúp tôi và chỉ cho tôi cách ví dụ này có thể được thực hiện trong kịch bản với tài sản lồng nhau. Ý tôi là thay vì:

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

Với giải pháp rằng:

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

Làm thế nào tôi có thể xây dựng các cây sau?

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

'Dữ liệu' là gì? Chỉ định tài sản này –

+0

Sergii cảm ơn sự giúp đỡ. Cuối cùng tôi giải quyết điều đó - bạn có thể kiểm tra nó bên dưới cập nhật. Dòng thứ hai được thêm vào và thứ ba được thay đổi. –

Trả lời

0

(Câu trả lời này ban đầu được đăng bởi OP trong câu hỏi.)

Vấn đề có thể được giải quyết với:

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

Đây là câu trả lời tương tự như đăng ở trên, nhưng tôi tìm điều này dễ đọc hơn về việc hình dung cây biểu thức:

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); 
Các vấn đề liên quan