2011-08-24 36 views
24

對於「不在」SQL等效實體框架語法,我有一個簡單的問題。從本質上講,我想下面的SQL語法轉換成實體框架語法:實體框架4.1的SQL「not in」語法

select ID 
from dbo.List 
where ID not in (list of IDs) 

這裏是我使用的用於查找單個記錄的方法:

public static List GetLists(int id) 
{ 
    using (dbInstance db = new dbInstance()) 
    { 
     return db.Lists.Where(m => m.ID == id); 
    } 
} 

這裏是一個僞方法我想用這個:

public static List<List> GetLists(List<int> listIDs) 
{ 
    using (dbInstance db = new dbInstance()) 
    { 
     return db.Lists.Where(**** What Goes Here ****).ToList(); 
    } 
} 

誰能給我指針作爲在Where條款面積發生的事情?我讀了一些關於這個的論壇,看到提到使用.Contains().Any(),但沒有一個例子足夠接近。

+1

+1非常好,措辭得當,在這裏問Stack Overflow。歡迎。 – ckittel

回答

49

給這個一展身手......

public static List<List> GetLists(List<int> listIDs) 
{ 
    using (dbInstance db = new dbInstance()) 
    { 
     // Use this one to return List where IS NOT IN the provided listIDs 
     return db.Lists.Where(x => !listIDs.Contains(x.ID)).ToList(); 

     // Or use this one to return List where IS IN the provided listIDs 
     return db.Lists.Where(x => listIDs.Contains(x.ID)).ToList(); 
    } 
} 

這些將變成約以下數據庫查詢:

SELECT [Extent1].* 
FROM [dbo].[List] AS [Extent1] 
WHERE NOT ([Extent1].[ID] IN (<your,list,of,ids>)) 

SELECT [Extent1].* 
FROM [dbo].[List] AS [Extent1] 
WHERE [Extent1].[ID] IN (<your,list,of,ids>) 

+0

這是完美的 - 沒有打嗝的工作!感謝這些例子。 –

+2

這裏非常簡潔的解釋。 – BentOnCoding

2

試試這個對於新手...

m => !listIDs.Contains(m.ID) 
3

這一個需要你想向後一點點。與其詢問該值是否不在某個ID列表中,您必須詢問某個ID列表不包含該值。像這樣

int[] list = new int[] {1,2,3} 
Result = (from x in dbo.List where list.Contains(x.id) == false select x); 
0

這可能是一種方法做你想要什麼:

// From the method you provided, with changes... 
public static List GetLists(int[] ids) // Could be List<int> or other =) 
{ 
    using (dbInstance db = new dbInstance()) 
    { 
     return db.Lists.Where(m => !ids.Contains(m.ID)); 
    } 
} 

但是我發現,這樣做可能會在某些情況下引發錯誤,特別是當列表太大而連接是有點慢。

記得檢查一切之前,所以這個過濾器可能有較少的值來檢查。

還要記住,當您構建過濾器/查詢(至少不是默認情況下)時,Linq不會填充該變量。如果您要爲每條記錄進行迭代,請記得在之前調用ToList()或ToArray()方法,除非每條記錄都有500MB或更多...