2011-08-23 52 views
6

使用PredicateBuilder如何獲得類似於SQL IN或NOT IN查詢的功能?具有「NOT IN」功能的C#謂詞生成器

例如,我有一個ID列表,我希望選擇所有ID匹配或不匹配ID的人員。

人民匹配功能是相當簡單的(雖然有可能是一個更好的方式來做到這一點)

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

那麼,如何得到相反的?我想要所有ID不在personIDs列表中的人。

+0

作爲解決方法,我能夠獲得預過濾的PersonID列表,以便我可以使用上面的代碼。這並不理想,但它會起作用。 –

回答

3

De Morgan

NOT(P或Q)=(非P)和(非Q)

將驗證碼生成的一個NOT IN條件,改寫爲等效

var predicate = PredicateBuilder.True<Person>() 

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

這是我第一次嘗試,但是我從SQL獲得一個空的結果集。當我從Profiler中檢查SQL時,我得到的結果是 SELECT CAST(NULL as varchar(1))as [C1], 。 。 。 FROM(SELECT 1 as X)AS [SingleRowTable1] WHERE 1 = 0 –

0

這是你想要的嗎?

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

不看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

你使用實體框架?

然後你就可以建立查詢,而不PredicateBuilder:

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

從這個LINQ聲明NOT IN創建查詢SQL。