Tengo una lista que contiene las identificaciones de mi UserProfile
mesa. ¿Cómo puedo seleccionar todo en UserProfiles
función de la lista de identificaciones que obtuve en unvar
uso LINQ
?
var idList = new int[1, 2, 3, 4, 5];
var userProfiles = _dataContext.UserProfile.Where(......);
Me quedé atrapado aquí mismo. Puedo hacer esto usando bucles for, etc. Pero prefiero hacer esto conLINQ
.
Respuestas:
Puedes usar
Contains()
para eso. Se sentirá un poco al revés cuando realmente esté tratando de producir unaIN
cláusula, pero esto debería ser suficiente:También supongo que cada
UserProfile
registro tendrá unint
Id
campo. Si ese no es el caso, tendrá que ajustar en consecuencia.fuente
Contains()
manejará esa verificación de igualdad en cadaid
valor si lo usa como lo he escrito en la respuesta. No tiene que escribir explícitamente en==
ningún lugar cuando intenta comparar los elementos de un conjunto (la matriz) con otro (la tabla de la base de datos).La solución con .Where y .Contains tiene una complejidad de O (N cuadrado). Simple .Join debería tener un rendimiento mucho mejor (cerca de O (N) debido al hash). Entonces el código correcto es:
Y ahora resultado de mi medida. Genere 100 000 UserProfiles y 100 000 ID. Join tomó 32ms y .Where with .Contains tomó 2 minutos y 19 segundos. Usé IEnumerable puro para esta prueba para probar mi declaración. Si usa List en lugar de IEnumerable, .Where y .Contains serán más rápidos. De todos modos la diferencia es significativa. El .Donde .Contains más rápido es con Set <>. Todo depende de la complejidad de las colecciones subyacentes para .Contains. Mira esta publicación para aprender sobre la complejidad de linq. Mira mi ejemplo de prueba a continuación:
Salida de consola:
fuente
List
se usa. +1Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
error al usar el contexto de datos LINQ2SQL.Buenas respuestas a continuación, pero no olvide una cosa IMPORTANTE : ¡brindan resultados diferentes!
Esto devolverá 2 filas de DB (y esto podría ser correcto, si solo desea una lista ordenada de usuarios distinta)
PERO en muchos casos, es posible que desee una lista de resultados sin clasificar . Siempre tienes que pensar en ello como en una consulta SQL. Consulte el ejemplo con el carrito de compras de eshop para ilustrar lo que está sucediendo:
Esto devolverá 5 resultados de DB. Usar 'contiene' sería incorrecto en este caso.
fuente
Eso debería ser simple. Prueba esto:
fuente