Pregunta

Estoy confundido en cuanto a la diferencia. Al ser bastante nuevo en .Net, sé que puedo consultar IEnumerables utilizando las extensiones de LINQ. Entonces, ¿qué es esto IQueryable y en qué se diferencia?


¿Cuál es la diferencia entre IQueryable [T] y IEnumerable [T]? que se superpone con esta pregunta.

¿Fue útil?

Solución

IEnumerable<T> representa un cursor de sólo avance de T. .NET 3,5 añadieron métodos de extensión que incluyeron el LINQ standard query operators como Where y First, con cualquier operadores que requieren predicados o funciones anónimas que toman Func<T>.

IQueryable<T> implementa los operadores de consulta estándar de LINQ misma, pero acepta Expression<Func<T>> de predicados y funciones anónimas. Expression<T> es un árbol de expresión compilado, una versión rota en marcha del método ( "medio-compilado" si se quiere) que puede ser analizado por el proveedor del consultable y usada en consecuencia.

Por ejemplo:

IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

En el primer bloque, x => x.Age > 18 es un método anónimo (Func<Person, bool>), que puede ser ejecutado como cualquier otro método. Enumerable.Where ejecutará el método una vez para cada persona, valores para los cuales el método de regresar yield trueing.

En el segundo bloque, x => x.Age > 18 es un árbol de expresión (Expression<Func<Person, bool>>), que se puede considerar como "es la 'edad' propiedad> 18".

Esto permite que existan cosas como LINQ a SQL, ya que pueden analizar el árbol de expresión y convertirlo en SQL equivalente. Y porque el proveedor no tiene que ejecutar hasta que se enumera el IQueryable (que implementa IEnumerable<T>, después de todo), puede combinar varios operadores de consulta (en el ejemplo anterior Where y FirstOrDefault) a tomar decisiones más inteligentes sobre cómo ejecutar la consulta completa en contra de la fuente de datos subyacente (como usar SELECT TOP 1 en SQL).

Ver:

Otros consejos

En la vida real, si está utilizando un ORM como LINQ a SQL

  • Si crea una IQueryable, la consulta se puede convertir a SQL y se ejecuta en el servidor de base de datos
  • Si crea una IEnumerable, a continuación, todas las filas serán sacados en la memoria como objetos antes de ejecutar la consulta.

En ambos casos, si no llamar a un ToList() o ToArray() continuación, consulta se ejecuta cada vez que se utiliza, por lo que, por ejemplo, tiene una IQueryable y llenar 4 cuadros de lista de ella, la consulta se llevará a cabo contra la base de datos 4 veces.

Además, si usted extiende su consulta:

q.Select(x.name = "a").ToList()

A continuación, con un IQueryable el SQL generado contendrá where name = "a", pero con un IEnumerable muchos más papeles se retiraron de la base de datos, la comprobación x.name = "a" será realizado por .NET.

"La principal diferencia es que los métodos de extensión definidos para IQueryable toman Expresión objetos en lugar de objetos Func, es decir, el delegado que recibe es un árbol de expresión en lugar de un método para invocar. IEnumerable es ideal para trabajar con colecciones en memoria, pero IQueryable permite una fuente de datos remota, como una base de datos o servicio web "

Fuente: aquí

IEnumerable IEnumerable es la más apropiada para trabajar con la colección en memoria. IEnumerable no se mueve entre los elementos, es sólo hacia adelante colección.

IQueryable IQueryable mejores trajes para fuente de datos remota, como un servicio de base de datos o en la web. IQueryable es una característica muy poderosa que permite una variedad de escenarios de ejecución diferida interesantes (como la paginación y consultas basadas composición).

Así que cuando se tiene que repetir simplemente a través de la colección en memoria, utilizar IEnumerable, si lo que necesita hacer ningún tipo de manipulación con la colección como la base de datos y otras fuentes de datos, utilice IQueryable

La principal diferencia es que IEnumerable enumerará todos sus elementos todo el tiempo, mientras que IQueryable enumerará los elementos, o incluso hacer otras cosas, sobre la base de una consulta. La consulta es una expresión (una representación de datos de código .Net), que debe explorar una IQueryProvider / interpretar / compile / lo que sea con el fin de generar resultados.

Tener una expresión de consulta da dos ventajas.

La primera ventaja es la optimización. Debido modificadores como 'dónde' están incluidas en la expresión de consulta, la IQueryProvider puede aplicar optimizaciones de otra manera imposibles. En lugar de devolver todos los elementos y luego tirar la mayoría de ellos debido a una cláusula 'Dónde', el proveedor podría utilizar una tabla hash para localizar artículos con una clave dada.

La segunda ventaja es la flexibilidad. Debido a que las expresiones son estructuras de datos explorables, puede hacer cosas como serializar la consulta y enviarlo a una máquina remota (p. LINQ-to-SQL).

IQueriable es la misma que IEnumerable sino que también proporciona una funcionalidad adicional para implementar la consulta con LINQ personalizado. He aquí la descripción en MSDN: http://msdn.microsoft. com / es-es / library / system.linq.iqueryable.aspx

En primer lugar IEnumerable se encuentran en un espacio de nombres System.Collections mientras que el IQueryable se encuentran en un espacio de nombres System.Linq. Si estás acostumbrado IEnumerable al consultar los datos de colecciones en la memoria como lista, recogida de matriz, etc. Y cuando se consultan los datos de fuera de la memoria (como base de datos remota, servicio) colecciones por lo que son IQueryable utilizar. Debido al consultar los datos de la base de datos, IEnumerable ejecutar consulta de selección en el lado del servidor, los datos de carga en memoria en el lado del cliente y luego filtrar los datos. Por lo tanto lo hace más trabajo y se vuelve lento. Al consultar los datos de la base de datos, IQueryable ejecutar consulta de selección en el lado del servidor con todos los filtros. Por lo tanto, hace menos trabajo y se convierte rápidamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top