He estado viendo muchos proyectos que tienen repositorios que devuelven instancias de IQueryable
. Esto permite filtros adicionales y la clasificación se puede realizar en IQueryable
otro código, lo que se traduce en diferentes SQL que se generan. Tengo curiosidad de dónde vino este patrón y si es una buena idea.
Mi mayor preocupación es que IQueryable
es una promesa de llegar a la base de datos algún tiempo después, cuando se enumera. Esto significa que se arrojaría un error fuera del repositorio. Esto podría significar que se lanza una excepción de Entity Framework en una capa diferente de la aplicación.
También me he encontrado con problemas con los Conjuntos de resultados activos múltiples (MARS) en el pasado (especialmente cuando se usan transacciones) y parece que este enfoque llevaría a que esto suceda con más frecuencia.
Siempre he llamado AsEnumerable
o ToArray
al final de cada una de mis expresiones LINQ para asegurarme de que la base de datos se golpea antes de abandonar el código del repositorio.
Me pregunto si regresar IQueryable
podría ser útil como un bloque de construcción para una capa de datos. He visto un código bastante extravagante con un repositorio que llama a otro repositorio para construir uno aún más grande IQueryable
.
where
cláusula a un diferido IQueryable
, solo tiene que enviar esos datos por cable, no todo el conjunto de resultados.