Eu tenho visto muitos projetos que têm repositórios que retornam instâncias de IQueryable
. Isso permite que filtros adicionais e classificação possam ser executados IQueryable
por outro código, que se traduz em diferentes SQL sendo gerados. Estou curioso de onde veio esse padrão e se é uma boa ideia.
Minha maior preocupação é que um IQueryable
é uma promessa de atingir o banco de dados algum tempo depois, quando for enumerado. Isso significa que um erro seria lançado fora do repositório. Isso pode significar que uma exceção do Entity Framework é lançada em uma camada diferente do aplicativo.
Também já tive problemas com o MARS (Multiple Active Result Sets) no passado (especialmente ao usar transações) e essa abordagem parece que levaria a isso acontecer com mais frequência.
Eu sempre liguei AsEnumerable
ou ToArray
no final de cada uma das minhas expressões LINQ para garantir que o banco de dados seja atingido antes de sair do código do repositório.
Gostaria de saber se o retorno IQueryable
poderia ser útil como um bloco de construção para uma camada de dados. Eu vi um código bastante extravagante com um repositório chamando outro repositório para criar um ainda maior IQueryable
.
where
cláusula a um adiado IQueryable
, você só precisará enviar esses dados pela conexão, não todo o conjunto de resultados.