2013-03-10 30 views
6

Tôi bắt đầu sử dụng LinqKit 's PredicateBuilder để tạo vị ngữ bằng các điều kiện HOẶC không thể có với biểu thức LINQ.LinqKit PredicateBuilder trả về tất cả hoặc không phải hàng

Vấn đề tôi đang phải đối mặt là nếu tôi bắt đầu với PredicateBuilder.True<MyEntity>()trả về tất cả hàng và nếu tôi bắt đầu với PredicateBuilder.False<MyEntity>()trả phi hàng, ngoài những gì biểu hiện tôi sử dụng! xem mã bên dưới:

 var pre = PredicateBuilder.True<MyEntity>(); 
     pre.And(m => m.IsActive == true); 

     using (var db = new TestEntities()) 
     { 
      var list = db.MyEntity.AsExpandable().Where(pre).ToList(); 
      dataGridView1.DataSource = list; 
     } 

Nó sẽ trả về hàng có IsActive == true, nhưng nó trả về tất cả các hàng!

Tôi đã thử tất cả các kết hợp có thể có của PredicateBuilder.True | PredicateBuilder.False với And | Or phương pháp, không hoạt động!

Trả lời

13

Phần mở rộng-method And không sửa đổi vị ban đầu - nó trả về một mới vị đại diện cho ban ngữ AND ed cùng với vị quy định.

có hiệu quả, hoạt động của bạn không thay đổi vị gọi bằng biến pre của bạn, có nghĩa là bạn kết thúc với toàn bộ hoặc không ai trong số các hồ sơ dựa vào việc bạn khởi tạo vị gốc để true hoặc false.

Hãy thử:

var pre = PredicateBuilder.True<MyEntity>(); 
    pre = pre.And(m => m.IsActive); 

Nếu bạn đang có kế hoạch OR vị từ với nhau, nhớ để bắt đầu với một vị ban đầu false.

var pre = PredicateBuilder.False<MyEntity>(); 
    pre = pre.Or(m => m.IsActive); 
+0

OMG !! Đó là một sai lầm ngớ ngẩn. Tôi đã mắc sai lầm tương tự về phương pháp 'string.Replace' 3 năm trước !!! Cảm ơn nhiều. – Ashkan

+0

Cảm ơn bạn đã làm rõ – leen3o

Các vấn đề liên quan