2011-08-23 55 views
6

Với PredicateBuilder làm thế nào để tôi có được chức năng tương tự như truy vấn SQL IN hoặc NOT IN?C# Predicate Builder có chức năng "NOT IN"

Ví dụ: tôi có danh sách ID và tôi muốn chọn tất cả những người có ID khớp hoặc không khớp với ID.

Chức năng người trận đấu là khá đơn giản (mặc dù có thể có một cách tốt hơn để làm điều đó)

var predicate = PredicateBuilder.False<Person>() 
foreach (int i in personIDs) 
{ 
    int temp = i; 
    predicate = predicate.Or(e=>e.PersonID == temp); 
} 
return persons.Where(predicate); 

Vì vậy, làm thế nào để tôi nhận được điều ngược lại? Tôi muốn tất cả những người có ID không có trong danh sách personIDs.

+0

Để giải quyết sự cố, tôi có thể nhận danh sách các PersonID được lọc trước để tôi có thể sử dụng mã ở trên. Nó không lý tưởng, nhưng nó sẽ hoạt động. –

Trả lời

3

Hỏi De Morgan:

NOT (P HOẶC Q) = (KHÔNG P) AND (NOT Q)

Để có mã của bạn tạo ra tương đương với một NOT IN điều kiện, viết lại như

var predicate = PredicateBuilder.True<Person>() 

predicate = predicate.And(e=>e.PersonID != temp); 
+0

Đó là những gì tôi đã thử lần đầu tiên, tuy nhiên tôi nhận được một tập hợp kết quả rỗng từ SQL. Khi tôi kiểm tra SQL từ Profiler tôi nhận được một cái gì đó để ảnh hưởng của SELECT CAST (NULL như varchar (1)) là [C1], . . . FROM (SELECT 1 as X) AS [SingleRowTable1] WHERE 1 = 0 –

0

Đây có phải là điều bạn muốn không?

var predicate = PredicateBuilder.True<Person>() 
foreach (int i in personIDs) 
{ 
    int temp = i; 
    predicate = predicate.And(e => e.PersonID != temp); 
} 
return persons.Where(predicate); 
0

Nếu không nhìn vào api ....

var predicate = PredicateBuilder.True<Person>() 
foreach (int i in personIDs) 
{ 
    int temp = i; 
    predicate = predicate.And(e=>e.PersonID != temp); 
} 
return persons.Where(predicate); 
3

Bạn có sử dụng Entity Framework?

Sau đó, bạn có thể xây dựng các truy vấn mà không PredicateBuilder:

var personIds = new List<int>() { 8,9,10 }; 
var query = persons.Where(it => !personIds.Contains(it.PersonId)); 

Từ tuyên bố LINQ này một SQL NOT IN truy vấn được tạo ra.