2010-09-27 9 views
6

Estoy tratando de hacer una declaración LINQ to SQL que filtre los resultados donde la ID es no en una lista de enteros. Soy consciente de los .contains() método no se puede utilizar en LINQ to SQL, pero a los efectos de explicar lo que me gustaría hacer, esto es lo que me gustaría hacer:LINQ to SQL donde ID no está en alguna_list

nextInvention = (from inv in iContext.Inventions 
        where !historyList.Contains(inv.Id) 
        orderby inv.DateSubmitted ascending 
        select inv).First<Invention>(); 

alguna idea de cómo podría ir sobre hacer esto?

Gracias!

Respuesta

16

Containspuede utilizarse en LINQ to SQL ... es la forma normal de realizar consultas "IN". Recuerdo vagamente que hay algunas restricciones, pero definitivamente puede funcionar. Las restricciones pueden estar relacionadas con los tipos involucrados ... ¿es historyList a List<T>? Probablemente no sea compatible con arbitrariamente IEnumerable<T>, por ejemplo.

Ahora, no sé si la inversión del resultado funciona para dar una consulta "NO ENCENDIDA", pero al menos vale la pena intentarlo. ¿Has probado la consulta exacta de tu pregunta?

Un punto a tener en cuenta: Creo que la legibilidad de su consulta mejoraría si se trató de mantener una cláusula por línea:

var nextInvention = (from inv in iContext.Inventions 
        where !historyList.Contains(inv.Id) 
        orderby inv.DateSubmitted ascending 
        select inv) 
        .First(); 

También tenga en cuenta que, en este caso, la sintaxis del método es posiblemente más simple:

var nextInvention = iContext.Inventions 
          .Where(inv => !historyList.Contains(inv.Id)) 
          .OrderBy(inv => inv.DateSubmitted) 
          .First(); 
+0

Thanks mate! Funciona perfectamente. Además, lo tenía en una cláusula por línea, mi ingenuidad estaba en el marcado de stackoverflow^_^No rodeé el código correctamente. Saludos de todos modos :) – basicallydan