¿Por qué usar AsQueryable () en lugar de List ()?

Estoy empezando a usar el Patrón de repository para el acceso a datos con Entity Framework y LINQ como base de la implementación del Repositorio sin prueba. La mayoría de las muestras que veo devuelven AsQueryable () cuando la llamada devuelve N registros en lugar de List . ¿Cuál es la ventaja de hacer esto?

AsQueryable solo crea una consulta, las instrucciones necesarias para obtener una lista. Puede realizar más cambios en la consulta más adelante, como agregar nuevas cláusulas Where que se envíen hasta el nivel de la base de datos.

AsList devuelve una lista real con todos los elementos en la memoria. Si agrega un nuevo destino, no obtendrá el filtro rápido que proporciona la base de datos. En su lugar, obtiene toda la información en la lista y luego filtra lo que no necesita en la aplicación.

Entonces, básicamente se trata de esperar hasta el último momento posible antes de comprometerte.

La devolución de IQueryable tiene la ventaja de que la ejecución es definitiva hasta que empiece a enumerar el resultado y pueda redactar la consulta con otras consultas y obtener la ejecución del lado del servidor.

El problema es que no puede controlar la duración del contexto de la base de datos en este método; necesita un contexto abierto y debe asegurarse de que permanezca abierto hasta que se ejecute la consulta. Y luego debes asegurarte de que el contexto será eliminado. Si devuelve el resultado como una List , T[] o algo similar, pierde ejecución diferida y ejecución de consultas compuestas por parte del servidor, pero gana el control sobre la duración del contexto de la base de datos.

Lo que mejor se adapta, por supuesto, depende de los requisitos reales. Es otra pregunta sin una sola verdad.

AsQueryable es un método de extensión para IEnumerable que podría hacer dos cosas:

  • Si IEnumerable implementa IQueryable justs, no hace nada.
  • De lo contrario, crea un IEnumerable ( EnumerableQuery ) ‘falso’ que implementa todos los métodos que comstackn los métodos de extensión lambdas y de llamada a Enumerable.

Por lo tanto, en la mayoría de los casos, usar AsQueryable es inútil, a menos que se vea forzado a pasar un IQueryable a un método y usted tiene un IEnumerable en su lugar, es un hack.

NOTA: AsQueryable es un truco, ¡IQueryable por supuesto que no!

La devolución de IQueryable retrasará la ejecución de la consulta hasta que se utilicen realmente sus resultados. Hasta entonces, también puede realizar operaciones de consulta de base de datos adicionales en IQueryable ; en una List está restringido a las operaciones en memoria generalmente menos eficientes.