2011-08-17 38 views
7

Cách tốt nhất để thực hiện truy vấn có điều kiện bằng cách sử dụng LINQ cho đối tượng (không phải LINQ to sql).LINQ to objects Predicate Builder

Hiện tại tôi đang sử dụng công cụ xây dựng Predicate được tìm thấy tại đây http://www.albahari.com/nutshell/predicatebuilder.aspx và chuyển vị từ đã biên dịch sang IEnumerable.Where và có vẻ như hoạt động tốt.

Ví dụ mã của những gì tôi muốn giải quyết:

ví dụ như tôi có điều này

string keyword1 = "Test1"; 
string keyword2 = "Test3"; 

     IEnumerable<TestObject> tests = new List<TestObject>() 
            { 
             new TestObject() {Name1 = "Test1", Name2 = "Test1"}, 
             new TestObject() {Name1 = "Test2", Name2 = "Test2"}, 
             new TestObject() {Name1 = "Test3", Name2 = "Test3"}, 

            }; 

     if (!String.IsNullOrEmpty(keyword1) && String.IsNullOrEmpty(keyword2)) 
      tests = tests.Where(e => e.Name1.Contains(keyword1)); 
     else if (!String.IsNullOrEmpty(keyword2) && !String.IsNullOrEmpty(keyword1)) 
      tests = tests.Where(e => e.Name2.Contains(keyword2) || e.Name1.Contains(keyword1)); 

     return tests.ToList(); 

Trả lời

14

Chỉ cần thay đổi PredicateBuilder sử dụng các đại biểu thay vì cây biểu hiện và sử dụng lambdas để xây dựng các kết quả:

public static class DelegatePredicateBuilder 
{ 
    public static Func<T, bool> True<T>() { return f => true; } 
    public static Func<T, bool> False<T>() { return f => false; } 

    public static Func<T, bool> Or<T>(this Func<T, bool> expr1, 
            Func<T, bool> expr2) 
    { 
     return t => expr1(t) || expr2(t); 
    } 

    public static Func<T, bool> And<T>(this Func<T, bool> expr1, 
            Func<T, bool> expr2) 
    { 
     return t => expr1(t) && expr2(t); 
    } 
} 
+1

Điều đó làm việc Cảm ơn Jon, có bất kỳ vấn đề hiệu suất nào có thể gây ra bằng cách xây dựng các truy vấn như thế này so với thực hiện thủ công với các câu lệnh if dài – kwiri