2012-04-16 14 views
8

Hay algunas otras preguntas similares a esta, pero ninguna de ellas parece hacer lo que estoy tratando de hacer. Me gustaría que pase en una lista de cuerda y consultaLINQ con sabor IS IN Query

SELECT ownerid where sysid in ('', '', '') -- i.e. List<string> 

o como

var chiLst = new List<string>(); 
var parRec = Lnq.attlnks.Where(a => a.sysid IN chiList).Select(a => a.ownerid); 

He estado jugando con a.sysid.Contains(), pero no han sido capaces de conseguir en cualquier sitio.

+1

+1 si crees que debería haber una primera respuesta a tu pregunta por Jon Skeet Badge lol –

Respuesta

11

Contains es el camino a seguir:

var chiLst = new List<string>(); 
var parRec = Lnq.attlnks.Where(a => chiList.Contains(a.sysid)) 
         .Select(a => a.ownerid); 

A pesar de que estaría mejor con un HashSet<string> lugar de una lista, en términos de rendimiento, teniendo en cuenta toda la contiene cheques. (Eso es suponiendo que habrá bastantes entradas ... para una pequeña cantidad de valores, no hará mucha diferencia de ninguna manera, y un List<string> puede incluso ser más rápido.)

Tenga en cuenta que el aspecto del rendimiento está asumiendo está utilizando LINQ to Objects para esto; si está utilizando algo como LINQ to SQL, no importará ya que la verificación Contains no se realizará en proceso de todos modos.

+0

+1. 5 votos en un minuto, felicidades :) – mellamokb

+3

Para algo como Linq en SQL, HashSet no hará ninguna diferencia, ya que solo toma todos los elementos de la lista y genera la cláusula IN. – RobSiklos

+0

@Jon Skeet ¿Cuál es la diferencia usando HashSet Jon? –

1

No debe llamar al a.sysid.Contains; la sintaxis para IN (SQL) es la inversa de la sintaxis para Contains (LINQ)

var parRec = Lnq.attlnks.Where(a => chiList.Contains(a.sysid)) 
         .Select(a => a.ownerid); 
1

Además del enfoque Contains, usted podría join:

var parRec = from a in Lnq.attlnks 
      join sysid in chiLst 
       on a.sysid equals sysid 
      select a.ownerid 

No estoy seguro de si esto funcionará mejor que Contains con un HashSet, pero al menos tendrá un rendimiento similar. Ciertamente será mejor que usar Contains con una lista.

+0

Suponiendo LINQ to Objects, básicamente construirá un 'HashSet ' dentro de la implementación de join. (Y será más rápido que un 'List ' * si la lista crece en grande * - si la lista es muy corta, entonces una implementación basada en hash podría ser más lenta, ya que primero necesita generar el hash del objetivo. hay todo tipo de variables en juego, de verdad.) –