2010-04-20 18 views
15

He visto a mucha gente hablar sobre IQueryable y no he entendido bien de qué se trata todo este alboroto. Siempre trabajo con los genéricos List y encuentro que son muy ricos en la forma en que puede "consultarlos" y trabajar con ellos, incluso ejecutar consultas LINQ contra ellos.¿Cuál es el problema con IQueryable?

Me pregunto si hay una buena razón para empezar a considerar una colección predeterminada diferente en mis proyectos.

+0

'IQueryable' es fundamentalmente diferente de' list' - ambos tienen sus usos. –

Respuesta

42

La interfaz IQueryable le permite definir partes de una consulta en un proveedor de LINQ remoto (generalmente contra una base de datos, pero no tiene que serlo) en varios pasos y con ejecución diferida.

E.g. su capa de base de datos podría definir alguna restricción (por ejemplo, basada en permisos, seguridad, lo que sea) agregando una cláusula .Where(x => x.......) a su consulta. Pero esto no se ejecuta por el momento, p. usted es no recuperando 150'000 filas que coinciden con ese criterio.

En su lugar, se pasa de la interfaz IQueryable al siguiente nivel, la capa de negocios, donde puede agregar requisitos adicionales y cláusulas donde su consulta - nuevamente, nada se ejecuta aún, tampoco está lanzando 80,000 de sus 150,000 filas recuperadas; solo está definiendo criterios de consulta adicionales.

Y la capa de interfaz de usuario podría hacer lo mismo, p. basado en la entrada del usuario en una forma o algo.

Lo mágico es que está pasando la interfaz IQueryable a través de todas las capas, lo que le agrega críticas adicionales, pero no se ejecuta/evalúa hasta que realmente lo fuerce. Esto también significa que no está innecesariamente seleccionando y recuperando toneladas de datos que terminará descartando después.

No se puede hacer eso con una lista estática clásica; hay que elegir los datos, posiblemente descartando una gran cantidad de ellos más adelante en el proceso; después de todo, tiene una lista estática.

+2

+1 Respuesta muy descriptiva marc ... –

7

IQueryable le permite realizar consultas utilizando LINQ, al igual que las consultas de LINQ to Object, donde las consultas se "compilan" realmente y se ejecutan en otro lugar.

Las implementaciones más comunes funcionan contra bases de datos. Si usa List<T> y LINQ en Objetos, carga toda la "tabla" de datos en la memoria y luego ejecuta su consulta.

Al usar IQueryable<T>, el LINQ proporciona puede "traducir" su instrucción LINQ en código SQL real, y ejecutarlo en la base de datos. Los resultados pueden devolverse a usted y enumerarse.

Esto es mucho, mucho más eficiente, especialmente si está trabajando en sistemas N-Tiered.

4

Las consultas LINQ contra IEnumerable<T> producen delegados (métodos) que, cuando se invocan, realizan la consulta descrita.

Las consultas de LINQ en contra de IQueryable<T> producen expression trees, una estructura de datos que representa el código que produjo la consulta. Los proveedores de LINQ como LINQ to SQL interpretan estas estructuras de datos, generando la misma consulta en la plataforma de destino (T-SQL en este caso).

Para un ejemplo de cómo el compilador interpreta la sintaxis de consulta en IQueryable<T>, ver mi respuesta a esta pregunta:

Building Dynamic LINQ Queries based on Combobox Value

Cuestiones relacionadas