2013-08-22 46 views
8

Tôi chỉ muốn xây dựng bộ lọc động. Và cuối cùng để trởLàm thế nào để chuyển đổi IQueryable <T> thành Biểu thức <Func <T, bool>>?

Expression<Func<Event, bool>> 

Tôi đã cố gắng sử dụng Kết hợp biểu thức (AndAlso), nhưng nó đã không workin và cuối cùng tôi phát hiện ra rằng có những thắc mắc IQueryable mà làm việc tốt, nhưng bây giờ làm thế nào tôi có thể chuyển đổi nó vào kiểu trả -

Expression<Func<Event, bool>>? 

mã của tôi:

public IQueryable<Event> GetBySearch(EventFilter search) 
    { 
     IQueryable<Event> query = this.Context.Events.AsQueryable(); 
     Expression<Func<Event, bool>> expression = null; 

     if (search.CategoryId != 0) 
     { 
      query = query.Where(x => x.CategoryId == search.CategoryId); 
     } 

     if (search.SubCategoryId != 0) 
     { 
      query = query.Where(x => x.SubCategoryId == search.SubCategoryId); 
     } 

     expression = query.Expression as Expression<Func<Event, bool>>; //This convert is not working, it returns null. 

     return this.Context.Events.Where(expression); 
    } 
+0

Hãy xem các cập nhật Câu trả lời (Tôi nghĩ rằng bạn đã chấp nhận nó một không chắc chắn nó bạn vẫn nhận được thông báo trong trường hợp đó) mà có bình luận của Florian vào tài khoản. – Sam

Trả lời

6

Bất kỳ lý do bạn không chỉ làm như sau:

public IQueryable<Event> GetBySearch(EventFilter search) 
{ 
    IQueryable<Event> query = this.Context.Events.AsQueryable(); 

    if (search.CategoryId != 0) 
    { 
     query = query.Where(x => x.CategoryId == search.CategoryId); 
    } 

    if (search.SubCategoryId != 0) 
    { 
     query = query.Where(x => x.SubCategoryId == search.SubCategoryId); 
    } 

    return query; 
} 

Như Florian đã nói trong nhận xét, nên tránh trả lại IQueryables (nếu có thể). Các giải pháp dễ dàng là để trả về một danh sách thay vì:

public List<Event> GetBySearch(EventFilter search) 
{ 
    IQueryable<Event> query = this.Context.Events.AsQueryable(); 

    if (search.CategoryId != 0) 
    { 
     query = query.Where(x => x.CategoryId == search.CategoryId); 
    } 

    if (search.SubCategoryId != 0) 
    { 
     query = query.Where(x => x.SubCategoryId == search.SubCategoryId); 
    } 

    return query.ToList(); 
} 
+0

Ồ, điều đó thực sự dễ dàng, bây giờ nó hoạt động, cảm ơn bạn rất nhiều :) –

+0

Điều này làm rò rỉ IQueryable chưa được đánh giá mà sau đó có thể dẫn đến kết quả không mong muốn. Vì phạm vi của 'tìm kiếm' không được cố định thành' GetBySearch' -> Thực hành xấu – LunicLynx

+1

@FlorianDohrendorf True. Dễ dàng sửa chữa nếu bạn thực hiện hàm trả về một 'List ' và 'return query.ToList()'. Trừ khi bạn _really_ cần IQueryable đó sẽ là con đường để đi. Tôi sẽ chỉnh sửa nó. – Sam

2

chuyển đổi này là không hợp lệ vì Where chuyển đổi nó thành một MethodCallExpression

Đây sẽ là hợp lệ:

MethodCallExpression e = query.Expression as MethodCallExpression; 
Các vấn đề liên quan