O objetivo é AsQueryable()
apenas para que você possa passar um IEnumerable
para métodos que você pode esperar IQueryable
, ou há uma razão útil para representar IEnumerable
como IQueryable
? Por exemplo, deve ser para casos como este:
IEnumerable<Order> orders = orderRepo.GetAll();
// I don't want to create another method that works on IEnumerable,
// so I convert it here.
CountOrders(orders.AsQueryable());
public static int CountOrders(IQueryable<Order> ordersQuery)
{
return ordersQuery.Count();
}
Ou realmente faz algo diferente:
IEnumerable<Order> orders = orderRepo.GetAll();
IQueryable<Order> ordersQuery = orders.AsQueryable();
IEnumerable<Order> filteredOrders = orders.Where(o => o.CustomerId == 3);
IQueryable<Order> filteredOrdersQuery = ordersQuery.Where(o => o.CustomerId == 3);
// Are these executed in a different way?
int result1 = filteredOrders.Count();
int result2 = filteredOrdersQuery.Count();
As IQueryable
versões desses métodos de extensão apenas criam uma Expressão que acaba fazendo a mesma coisa depois de executada? Minha pergunta principal é: qual é um caso de uso real para usar AsQueryable
?
fonte
IQueryable<T>
deriva de,IEnumerable<T>
você pode explicar o que quer dizer com "IQueryable com base não enumerável"?IQueryable
que é mais do que apenas embrulhadoIEnumerable
e que realmente aproveita os recursos adicionais de umIQueryable
.O caso mais válido que tenho para AsQueryable é o teste de unidade. Digamos que eu tenha o seguinte exemplo um tanto artificial
e quero escrever um teste de unidade para ter certeza de que o controlador devolve os resultados retornados do repositório. Seria mais ou menos assim:
onde, na verdade, tudo o que o método AsQueryable () me permite fazer é satisfazer o compilador ao configurar um mock.
Eu estaria interessado em onde isso é usado no código do aplicativo.
fonte
Como sanjuro observou, a finalidade de AsQueryable () é explicada em Usando AsQueryable com Linq para objetos e Linq para SQL . Em particular, o artigo afirma,
fonte
A finalidade de AsQueryable () é amplamente explicada neste artigo Usando AsQueryable com Linq To Objects e Linq To SQL
Na seção de comentários do método Queryable.AsQueryable do MSDN:
Isso é exatamente o que é mencionado e usado no artigo acima. Em seu exemplo, depende do que está retornando orderRepo.GetAll, IEnumerable ou IQueryable (Linq para Sql). Se retornar IQueryable, o método Count () será executado no banco de dados, caso contrário será executado na memória. Observe atentamente o exemplo no artigo referenciado.
fonte
IQueryable
Documentação de cotação da interface :Portanto, para alguém que pretende tornar sua estrutura de dados consultável em .NET, aquela estrutura de dados desnecessária pode ser enumerada ou ter um enumerador válido .
IEnumerator
é uma interface para iterar e processar o fluxo de dados .fonte
IQueryable
eIEnumerable
, mas não entendo o caso de uso doAsQueryable
método de extensão. Estou ficando um pouco confuso com essa frase, porém, suspeito que possa ter a resposta que estou procurando (com base nos votos positivos).AsQueryable()
?" Se estou começando com um IEnumerable (algo já capaz de fornecer uma capacidade de enumeração), por que precisaria converter paraIQueryable
usar o método de extensãoAsQueryable()
? Talvez um pequeno exemplo de código para ilustrar onde isso seria útil? Parece que está faltando algo em sua explicação. Obrigado pelo seu tempo.linq to sql
,linq to xml
e então .. se você quiser escrever umlinq
driver que vise suas estruturas de dados (linq to your data
), para que os usuários de sua api tenham a possibilidade de executarlinq
consultas em suas estruturas de dados, você deve escolherIQueryable
IQueryable
eIEnumerable
. Eu sei a diferença, e não é isso que estou pedindo. Estou perguntando por que alguém iria querer pegar algo que implementaIEnumerable
e convertê-lo em um método de extensãoIQueryable
usandoAsQueryable
. É isso que você está respondendo? Ainda não sei dizer ..