2011-11-07 12 views
20

He intentado buscar esto pero no encontré ejemplos que se adaptaran a mi situación.Operador de Linq IN

Tengo este método para clientes recurrentes. ¿Cómo puedo usar el conjunto de códigos de cadena para filtrarlo? Contiene no funciona para mí.

public static List<Customer> GetCustomers(string[] customerCodesArray) 
{ 
    using (busDataContext g = new busDataContext()) 
    { 
     return g.Customers.Where(
      x => x.customerCode.Contains(customerCodesArray)).ToList(); 
    } 
} 
+1

Por favor aclare "qué exactamente" no funciona ... – Didaxis

+0

¿Qué quiere decir con "no funciona"? ¿Obtiene un error de compilación? Si es así, ¿cuál es el error? ¿O recibes un error de tiempo de ejecución? Si es así, ¿cuál es el error? –

+1

posible duplicado de ["Where In" with linq to sql] (http://stackoverflow.com/questions/960827/where-in-with-linq-to-sql) – jrummell

Respuesta

31

Pruebe el siguiente código:

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
+2

Aunque técnicamente correcto, al usar SQL, esta no es la mejor solución. Requiere escanear toda la tabla Clientes y lo más probable es que aplique externamente cada registro en la matriz de códigos del cliente. La complejidad de esto se convierte en O (N * M). Sería más práctico usar una instrucción de combinación de Linq, para que la consulta SQL generada también pueda usar join. –

+0

@TonniTielens Eso depende completamente de los índices de la base de datos. No necesariamente generará un escaneo (y si lo hiciera, una unión tampoco le iría mejor). Desde mi experiencia, insertar en una tabla temporal y unir solo proporciona beneficios de rendimiento cuando 'customerCodesArray' contiene miles de elementos. – Rob

20

Usted es al revés:

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
11

Creo que se necesita para revertir la expresión Contains porque quiere ver si la matriz contiene el código de cliente, no al revés.

Prueba esto:

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
3

supongo que esto es lo que quiere

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
5

Trate

return g.Customers.Where(x=>customerCodesArray.Contains(x.CustomerCode)).ToList();