2011-08-24 10 views
24

Tengo un problema simple con la sintaxis de Entity Framework para el equivalente de SQL "no disponible". Esencialmente, Quiero convertir la sintaxis SQL siguiente en la sintaxis de Entity Framework:Sintaxis de SQL "no disponible" para Entity Framework 4.1

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

Aquí es un método que utilizo para buscar un registro único:

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

Aquí es un pseudo-método que Quiero usar para esto:

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

¿Puede alguien darme punteros en cuanto a lo que sucede en la zona Where cláusula? Leí algunos foros sobre esto y vi mencionar el uso de .Contains() o .Any(), pero ninguno de los ejemplos era lo suficientemente parecido.

+1

+1 Pregunta muy bonita y bien redactada por ser la primera preguntado aquí en Stack Overflow. Bienvenido. – ckittel

Respuesta

49

pruébalo ...

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

Estos se convertirán en aproximadamente las siguientes consultas de bases de datos:

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>) 

respectivamente.

+0

Esto es perfecto, ¡funcionó sin contratiempos! Gracias por los ejemplos. –

+2

Explicación muy concisa aquí. – BentOnCoding

2

probar este para empezar ...

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

Ésta requiere que usted piense hacia atrás un poco. En lugar de preguntar si el valor no está en alguna lista de identificadores, debe solicitar que una lista de identificadores no contenga el valor. Al igual que este

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

Esto podría ser una manera de hacer lo que quiera:

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

Sin embargo, me he dado cuenta que al hacerlo podría elevar error en algunos casos, especialmente cuando la lista es demasiado grande y la conexión es algo lento.

Recuerde verificar todo lo demás ANTES para que este filtro tenga menos valores para verificar.

Recuerde también que Linq no rellena la variable cuando crea su filtro/consulta (al menos no de manera predeterminada). Si vas a iterar para cada registro, recuerda llamar a un método ToList() o ToArray() antes, a menos que cada registro tenga 500MB o más ...

Cuestiones relacionadas