2013-05-09 30 views
8

Tôi đang xây dựng các vị từ sử dụng lớp PrediateBuilder LinqKit của để tự động lọc cài đặt và Tôi muốn kết hợp một lồng khác.làm tổ PredicateBuilder predicates: f 'Tham số '' đã không bị ràng buộc trong LINQ định to Entities truy vấn biểu hiện'

Tôi đã đọc này (http://www.albahari.com/nutshell/predicatebuilder.aspx):

enter image description here

Đây là mã của tôi:

// The main predicate. 
var mainPredicate = PredicateBuilder.True<Document>(); 

// ... some other conditions to the main predicate here ... 

// The inner predicate (combined conditions using OR). 
var innerPredicate = PredicateBuilder.False<Document>(); 

foreach (var period in periods) 
{ 
    var p = period; 
    innerPredicate = 
     innerPredicate.Or(
      d => 
      (d.Date >= p.DateFrom && d.Date <= p.DateTo)); 
} 

mainPredicate = mainPredicate.And(innerPredicate); 

documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList(); 

tôi kết hợp hai vị từ của tôi giống như nó được giải thích trong tài liệu. Tuy nhiên, tôi nhận được ngoại lệ này:

Tham số 'f' không bị ràng buộc trong LINQ định to Entities biểu thức truy vấn

đầu tiên tôi nghĩ rằng vị bên trong phải được mở rộng trước khi kết hợp nó với vị chính, vì vậy tôi đã thay đổi mã kết hợp của tôi thêm một cuộc gọi đến phương pháp vị bên trong của Expand như thế này:

mainPredicate = mainPredicate.And(innerPredicate.Expand()); 

Nhưng tôi nhận được cũ hành động ngoại lệ tương tự.

Sự khác biệt duy nhất trong mã của tôi so với tài liệu là tôi tự động tạo thuộc tính lồng nhau bằng cách sử dụng vòng lặp foreach. Tôi chỉ không biết làm thế nào nó có thể ảnh hưởng xấu đến biểu thức kết quả.

  • Điều gì sai với mã của tôi?

  • Tôi thực sự có thể gỡ lỗi điều này bằng cách nào?

  • Trường hợp thông số f xuất phát từ đâu? Nó được tạo ra như thế nào? Tại sao nó lại có vấn đề trong trường hợp của tôi?

  • Có một số loại visualizer cây biểu thức của một số loại có thể giúp tôi thực sự thấy có gì sai với biểu thức kết quả không? Bởi vì cơ thể của biểu cảm khó đọc.

+1

Nhìn vào [câu hỏi này] (http://stackoverflow.com/questions/2947820/c-sharp-predicatebuilder-entities-the-parameter-f-was-not-bound-in-the-specif) nó xuất hiện bạn có thể phải sử dụng 'Mở rộng()' bên trong 'Hoặc' của' innerPredicate' cũng như – jszigeti

+0

Tôi đã thử nó. Tôi nhận được cùng một ngoại lệ. –

Trả lời

4

Cuối cùng, tôi đã tìm thấy cách tránh kết hợp nhiều biến vị ngữ với cây biểu thức chính.

Cho rằng mỗi vị đại diện cho một bộ lọc khác nhau và tôi muốn trận chung kết, kết hợp bộ lọc là một loạt các phải-được-tôn trọng điều kiện, chúng ta có thể nói rằng mỗi người trong số các vị đã trở lại đúng cho vị từ cuối cùng để trả về true.

Để làm việc đó, các vị từ phải được kết hợp với AND. Vì vậy, truy vấn SQL kết quả phải giống như sau:

predicate1 AND predicate2 AND predicate3 ...

Cách tốt hơn để kết hợp các vị từ với AND là chuỗi Where nhà khai thác truy vấn để truy vấn cuối cùng, như thế này:

var documents = this.ObjectSet.AsExpandable() 
    .Where(mainPredicate) 
    .Where(otherPredicate) 
    .Where(yetAnotherPredicate) 
    .ToList(); 

Kết quả là truy vấn SQL sẽ kết hợp mỗi một trong các vị từ với AND. Đó chỉ là những gì tôi muốn làm.

Dễ dàng hơn việc tự mình lấy ra một cây biểu thức.