Le but est-il AsQueryable()
juste de pouvoir transmettre des IEnumerable
méthodes auxquelles on pourrait s'attendre IQueryable
, ou y a-t-il une raison utile de représenter IEnumerable
comme IQueryable
? Par exemple, est-ce censé être pour des cas comme celui-ci:
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 est-ce que cela le fait réellement faire quelque chose de différent:
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();
Les IQueryable
versions de ces méthodes d'extension construisent-elles simplement une expression qui finit par faire la même chose une fois exécutée? Ma question principale est, quel est un cas d'utilisation réel pour l'utilisation AsQueryable
?
la source
IQueryable<T>
dérive de,IEnumerable<T>
pouvez-vous s'il vous plaît expliquer ce que vous entendez par «IQueryable basé non énumérable»?IQueryable
qui est plus qu'un simple enveloppéIEnumerable
, et qui exploite en fait les capacités supplémentaires d'unIQueryable
.Le cas le plus valable que j'ai pour AsQueryable est le test unitaire. Disons que j'ai l'exemple quelque peu artificiel suivant
et je veux écrire un test unitaire pour m'assurer que le contrôleur renvoie les résultats renvoyés par le référentiel. Cela ressemblerait à quelque chose comme ceci:
où vraiment, tout ce que la méthode AsQueryable () me permet de faire est de satisfaire le compilateur lors de la configuration d'une maquette.
Je serais cependant intéressé de savoir où cela est utilisé dans le code d'application.
la source
Comme sanjuro l'a noté, le but d'AsQueryable () est expliqué dans Utilisation d'AsQueryable avec des objets Linq To et Linq To SQL . En particulier, l'article indique,
la source
Le but d'AsQueryable () est largement expliqué dans cet article Utilisation d'AsQueryable avec des objets Linq To et Linq To SQL
À partir de la section Remarques de MSDN Queryable.AsQueryable, méthode:
C'est exactement ce qui est mentionné et utilisé dans l'article ci-dessus. Dans votre exemple, cela dépend de ce que orderRepo.GetAll retourne, IEnumerable ou IQueryable (Linq to Sql). S'il retourne IQueryable, la méthode Count () sera exécutée sur la base de données sinon elle sera exécutée en mémoire. Regardez attentivement l'exemple dans l'article référencé.
la source
Interface
IQueryable
citant la documentation:Donc, pour quelqu'un qui a l'intention de rendre sa structure de données interrogeable dans .NET, cette structure de données qui n'est pas nécessaire peut être énumérée ou avoir un énumérateur valide .
IEnumerator
est une interface pour itérer et traiter le flux de données à la place.la source
IQueryable
etIEnumerable
, mais je ne comprends pas le cas d'utilisation de laAsQueryable
méthode d'extension. Je suis cependant un peu trébuché sur cette phrase, qui, je suppose, pourrait avoir la réponse que je recherche (sur la base des votes positifs).AsQueryable()
?» Si je commence avec un IEnumerable (quelque chose déjà capable de fournir une capacité d'énumération), pourquoi aurais-je besoin de convertir enIQueryable
utilisant la méthode d'extensionAsQueryable()
? Peut-être un petit exemple de code pour illustrer où cela serait utile? Il me semble qu'il me manque quelque chose dans votre explication. Merci pour votre temps.linq to sql
,linq to xml
et donc .. si vous voulez écrire unlinq
pilote qui cible vos strucutres de données (linq to your data
), afin que les utilisateurs de votre api aient la possibilité d'exécuter deslinq
requêtes sur vos structures de données, vous devez choisirIQueryable
IQueryable
etIEnumerable
. Je connais la différence, et ce n'est pas ce que je demande. Je demande pourquoi quelqu'un voudrait prendre quelque chose qui implémenteIEnumerable
et le convertir enIQueryable
utilisant laAsQueryable
méthode d'extension. C'est ce à quoi vous répondez? Je ne peux toujours pas dire ..