Si l'interface
IQueryable
effectue l'expression de requête dans le serveur plutôt que de chercher de tous les enregistrements commeIEnumerable
, pourquoi est-IQueryable
pas remplacé parIEnumerable
où il peut être plus rapide et plus efficace?IQueryable vs IEnumerable: IQueryable est-il toujours meilleur et plus rapide?DBSet<T>
a deux saveurs deWhere
(IQueryable
etIEnumerable
). Est-il possible d'appeler la versionIEnumerable
parce que leIQueryable
est appelé par défaut, sans appelerToList()
?
Répondre
- Si la
IQueryable
effectuer la requête d'expression dans le serveur plutôt que aller chercher tous les dossiers commeIEnumerable
, pourquoi pasIQueryable
remplacé parIEnumerable
où il peut être plus rapide et plus efficace?
IQueryable
et IEnumerable
représentent deux choses différentes. Pensez à un IQueryable
comme une "question", il n'a aucun résultat lui-même. Un IEnumerable
est une "réponse", il n'a que des données qui lui sont connectées mais vous ne pouvez pas dire ce qui a généré ces données. Ce n'est pas qu'un IQueryable
est "plus rapide" par exemple, il vous permet simplement de mettre votre filtrage et vos projections dans la "question" que vous posez au serveur SQL et de ne lui renvoyer que les réponses dont il a besoin (Sous la forme d'un IEnumerable
en appelant .ToList()
ou similaire).
Si vous n'utilisez qu'un IEnumerable
, la seule question que vous pouvez vous poser est "Donnez-moi tout ce que vous savez", puis sur la réponse qu'il vous donne, vous effectuez votre filtrage et vos projections. C'est pourquoi IQueryable
est considéré comme plus rapide, car il y a beaucoup moins de données à traiter car vous pouvez poser une question plus spécifique au serveur.
La raison IQueryable
n'a pas remplacé IEnumerable
partout parce que la chose que vous posez une question doit être en mesure de comprendre la question que vous posez. Il faut beaucoup de travail pour pouvoir analyser chaque chose possible que vous pourriez lui demander de filtrer ou projeter sur la plupart des implémentations limit themselves to only common things they know they need to be able to answer. Par exemple dans Entity Framework lorsque vous posez une question, il ne comprend pas comment gérer vous obtiendrez une erreur qui dit quelque chose de similaire à "La méthode spécifiée n'est pas supportée" lorsque vous essayez d'obtenir un IEnumerable
(une réponse) du IQueryable
.
DBSet<T>
a deux saveurs deWhere
(IQueryable
etIEnumerable
). est-il un moyen d'appeler la versionIEnumerable
parce que leIQueryable
est appelé par défaut, sans appelerToList()
?
La classe DBSet<T>
n'a pas Where method on it at all.Les deux fonctions Where
proviennent de deux méthodes d'extension, Enumerable.Where
et Queryable.Where
. Vous pouvez l'obliger à utiliser la surcharge Enumerable en convertissant l'objet en IEnumerable<T>
avant d'appeler la méthode d'extension. Cependant rappelez-vous, Queryable.Where
filtre la question, Enumerable.Where
ne filtre que le résultat.
Il est inutile de demander des résultats au serveur pour ensuite les jeter, donc je ne recommanderais pas de le faire.
Votre exemple (question et réponse) est génial, comme je l'ai compris, le 'IQueryable' n'est pas utile jusqu'à ce que je le convertisse en une liste' IEnumerable' pour obtenir la réponse désirable –