2017-04-14 1 views
0
  1. Si l'interface IQueryable effectue l'expression de requête dans le serveur plutôt que de chercher de tous les enregistrements comme IEnumerable, pourquoi est-IQueryable pas remplacé par IEnumerable où il peut être plus rapide et plus efficace?IQueryable vs IEnumerable: IQueryable est-il toujours meilleur et plus rapide?

  2. DBSet<T> a deux saveurs de Where (IQueryable et IEnumerable). Est-il possible d'appeler la version IEnumerable parce que le IQueryable est appelé par défaut, sans appeler ToList()?

Répondre

7
  1. Si la IQueryable effectuer la requête d'expression dans le serveur plutôt que aller chercher tous les dossiers comme IEnumerable, pourquoi pas IQueryable remplacé par IEnumerable 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 .

  1. DBSet<T> a deux saveurs de Where (IQueryable et IEnumerable). est-il un moyen d'appeler la version IEnumerable parce que le IQueryable est appelé par défaut, sans appeler ToList()?

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.

+0

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 –