He estado viendo muchos proyectos que tienen repositorios que devuelven instancias de IQueryable
. Esto permite que se puedan realizar filtros adicionales y la clasificación se puede realizar en el IQueryable
por otro código, lo que se traduce en la generación de un SQL diferente. Tengo curiosidad por saber de dónde viene este patrón y si es una buena idea.
Mi mayor preocupación es que un IQueryable
es una promesa de llegar a la base de datos algún tiempo después, cuando se enumera. Esto significa que un error se lanzaría fuera del repositorio. Esto podría significar que se lanza una excepción de Entity Framework en una capa diferente de la aplicación.
En el pasado, también me he encontrado con problemas con varios Conjuntos de resultados activos (MARS) (especialmente cuando se usan transacciones) y este enfoque parece que harí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 encuentre en el lugar antes de abandonar el código del repositorio.
Me pregunto si devolver 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 llamando a otro repositorio para construir un IQueryable
aún mayor.