web-dev-qa-db-fra.com

Pourquoi utiliser AsQueryable () au lieu de List ()?

Je commence à utiliser le modèle de référentiel pour l'accès aux données avec Entity Framework et LINQ comme fondement de la mise en œuvre du non -Test Repository. La plupart des exemples que je vois retournent AsQueryable () lorsque l'appel renvoie N enregistrements au lieu de List <T>. Quel est l'avantage de faire cela?

55
Keith Adler

AsQueryable crée simplement une requête, les instructions nécessaires pour obtenir une liste. Vous pouvez apporter des modifications supplémentaires à la requête ultérieurement, telles que l'ajout de nouvelles clauses Where qui sont envoyées jusqu'au niveau de la base de données.

AsList renvoie une liste réelle avec tous les éléments en mémoire. Si vous y ajoutez une nouvelle cluse Where, vous n'obtenez pas le filtrage rapide fourni par la base de données. Au lieu de cela, vous obtenez toutes les informations dans la liste, puis filtrez ce dont vous n'avez pas besoin dans l'application.

Donc, fondamentalement, cela revient à attendre le dernier moment possible avant de vous engager.

88
Jonathan Allen

Retour IQueryable<T> a l'avantage que l'exécution est différée jusqu'à ce que vous commenciez vraiment à énumérer le résultat et que vous puissiez composer la requête avec d'autres requêtes tout en obtenant une exécution côté serveur.

Le problème est que vous ne pouvez pas contrôler la durée de vie du contexte de base de données dans cette méthode - vous avez besoin d'un contexte ouvert et devez vous assurer qu'il reste ouvert jusqu'à ce que la requête soit exécutée. Et puis vous devez vous assurer que le contexte sera supprimé. Si vous renvoyez le résultat sous la forme d'un List<T>, T[], ou quelque chose de similaire, vous perdez l'exécution différée et l'exécution côté serveur des requêtes composées, mais vous contrôlez la durée de vie du contexte de la base de données.

Ce qui convient le mieux, bien sûr, dépend des besoins réels. C'est une autre question sans une seule vérité.

23
Daniel Brückner

AsQueryable est une méthode d'extension pour IEnumerable<T> qui pourrait faire deux choses:

  • Si la IEnumerable<T> met en oeuvre IQueryable<T> justs jette, ne fait rien.
  • Sinon, crée un "faux" IEnumerable<T> (EnumerableQuery<T>) qui implémente chaque méthode compilant les lambdas et appelant aux méthodes d'extension Enumerable.

Donc, dans la plupart des cas, utiliser AsQueryable est inutile, à moins que vous ne soyez obligé de passer un IQueryable à une méthode et que vous ayez un IEnumerable à la place, c'est un hack.

REMARQUE: AsQueryable est un hack, IQueryable ne l'est bien sûr pas!

11
Olmo

Retour IQueryable<T> retardera l'exécution de la requête jusqu'à ce que ses résultats soient réellement utilisés. En attendant, vous pouvez également effectuer des opérations de requête de base de données supplémentaires sur le IQueryable<T>; sur un List vous êtes limité aux opérations en mémoire généralement moins efficaces.

4
dahlbyk