2010-03-13 39 views
7

Tôi vừa mới đọc một câu hỏi gần đây trên using conditionals in Linq và nó nhắc tôi về một vấn đề mà tôi không thể giải quyết được. Khi xây dựng LINQ to SQL truy vấn một cách lập trình làm thế nào điều này có thể được thực hiện khi số lượng các điều kiện không được biết đến cho đến khi thời gian chạy? Ví dụ trong đoạn mã bên dưới mệnh đề đầu tiên tạo ra một IQueryable, nếu được thực hiện, sẽ chọn tất cả các nhiệm vụ (gọi là các vấn đề) trong cơ sở dữ liệu, mệnh đề thứ 2 sẽ tinh chỉnh đó chỉ là các vấn đề được gán cho một bộ phận. đã được chọn trong một combobox (trong đó có nó được chọn mục ràng buộc với các thuộc tính departmentToShow).Sử dụng điều kiện trong LINQ Programatically

Làm cách nào tôi có thể thực hiện việc này bằng cách sử dụng bộ sưu tập selectedItems?

IQueryable<Issue> issuesQuery; 

// Will select all tasks 
issuesQuery = from i in db.Issues 
       orderby i.IssDueDate, i.IssUrgency 
       select i; 

// Filters out all other Departments if one is selected 
    if (departmentToShow != "All") 
    { 
     issuesQuery = from i in issuesQuery 
         where i.IssDepartment == departmentToShow 
         select i; 
    } 

Bằng cách này, mã trên được đơn giản hóa, trong mã thực tế có khoảng một chục mệnh đề tinh chỉnh truy vấn dựa trên cài đặt tìm kiếm và bộ lọc người dùng.

Trả lời

7

Nếu số điều kiện là không rõ sau đó nó dễ dàng hơn để sử dụng cú pháp lambda thay vì hiểu truy vấn, ví dụ:

IQueryable<Issue> issues = db.Issues; 
if (departmentToShow != "All") 
{ 
    issues = issues.Where(i => i.IssDepartment == departmentToShow); 
} 
issues = issues.OrderBy(i => i.IssDueDate).ThenBy(i => i.IssUrgency); 

(Giả sử bạn muốn đặt hàng để xảy ra sau khi lọc, mà nó đã có những trường hợp - Tôi không chắc chắn nếu LINQ sẽ tạo ra một truy vấn tối ưu hóa nếu bạn cố gắng làm thứ tự đầu tiên).

Nếu bạn đã có một số lượng rất lớn các điều kiện bắt buộc sau đó bạn có thể làm sạch nó lên với các vị từ:

List<Predicate<Issue>> conditions = new List<Predicate<Issue>>(); 
if (departmentToShow != "All") 
    conditions.Add(i => i.IssDepartment == departmentToShow); 
if (someOtherThing) 
    conditions.Add(anotherPredicate); 
// etc. snip adding conditions 

var issues = from i in issues 
      where conditions.All(c => c(i)) 
      orderby i.IssDueDate, i.IssUrgency; 

Hoặc chỉ cần sử dụng PredicateBuilder mà có lẽ dễ dàng hơn.

+0

Thực tế một mục trong danh sách cần làm của tôi là kéo thứ tự rõ ràng ra và thêm vào giao diện để người dùng có một số điều khiển. –

+0

Trong biểu thức Lambda ở trên làm thế nào mà sẽ làm việc với departmentToShow là một bộ sưu tập từ một combobox, tôi đã nghĩ rằng những gì bạn có là chính xác giống như truy vấn tôi có. Tôi phải thú nhận tôi là người mới bắt đầu và Lambdas là một trong những thứ có ý nghĩa hơn với tôi trong sách hơn là trong thực tế. –

+0

@Mike B: Nó tương tự như những gì bạn có, nhưng rõ ràng là ít tiết và phiên bản gốc của bạn không đặt hàng trước bộ lọc thứ hai (bạn muốn nó xảy ra ở cuối). Nếu 'departmentToShow' là một bộ sưu tập thì bạn viết' departmentToShow.Contains (i.IssDepartment) 'thay vì' i.IssDepartment == departmentToShow'. – Aaronaught

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