2011-08-24 17 views
24

Ho un semplice problema con la sintassi Entity Framework per l'equivalente "non in" SQL. In sostanza, voglio convertire la seguente sintassi SQL in sintassi Entity Framework:Sintassi SQL "non in" per Entity Framework 4.1

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

Qui è un metodo che uso per la ricerca di un singolo record:

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

Ecco un metodo pseudo che voglio usare per questo:

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

qualcuno mi può dare indicazioni su ciò che accade nella zona Where clausola? Ho letto alcuni forum su questo e ho visto menzionare l'utilizzo di .Contains() o .Any(), ma nessuno degli esempi era abbastanza vicino.

+1

+1 Domanda molto bella e ben formulata per essere la tua prima chiesto qui su Stack Overflow. Benvenuto. – ckittel

risposta

49

dare un'andare ...

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(); 
    } 
} 

Questi diventeranno circa le seguenti query di database:

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

o

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

rispettivamente.

+0

Questo è perfetto - ha funzionato senza intoppi! Grazie per gli esempi. –

+2

spiegazione molto concisa qui. – BentOnCoding

2

Prova questa per cominciare ...

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

Questo richiede di pensare a ritroso un po '. Invece di chiedere se il valore non è in qualche elenco di id, devi chiedere che qualche lista di id non contenga il valore. Ti piace questa

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

Questo potrebbe essere un modo per fare ciò che si vuole:

// 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)); 
    } 
} 

Tuttavia ho trovato che così facendo potrebbe generare l'errore su alcuni scenari, specialmente quando la lista è troppo grande e il collegamento è un po 'lento.

Ricordarsi di controllare tutto il resto PRIMA quindi questo filtro potrebbe avere meno valori da controllare.

Ricordare inoltre che Linq non inserisce la variabile quando si crea il filtro/query (almeno non per impostazione predefinita). Se hai intenzione di iterare per ogni record, ricorda di chiamare prima un metodo ToList() o ToArray(), a meno che ogni record abbia 500 MB o più ...

Problemi correlati