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

je commence à utiliser le modèle de dépôt pour l'accès aux données avec le Entity Framework et LINQ comme la base de la mise en œuvre du dépôt non-Test. La plupart des exemples je vois return AsQueryable() lorsque l'appel renvoie N enregistrements au lieu de List. Quel est l'avantage de faire cela?

52
demandé sur Peter Mortensen 2009-07-10 02:37:00

4 réponses

AsQueryable crée une requête, les instructions nécessaires pour obtenir une liste. Vous pouvez apporter des modifications supplémentaires à la requête plus tard, comme ajouter de nouvelles clauses Where qui sont envoyées jusqu'au niveau de la base de données.

AsList retourne une liste avec tous les éléments en mémoire. Si vous ajoutez un nouvel Where cluse à celui-ci, vous n'obtiendrez pas le filtrage rapide fourni par la base de données. Au lieu de cela, vous obtenez toutes les informations dans la liste, puis filtrer ce que vous n'avez pas besoin dans l' application.

donc fondamentalement, il s'agit d'attendre jusqu'au dernier momment possible avant de vous engager.

85
répondu Jonathan Allen 2009-07-09 22:41:48

retour IQueryable<T> a l'avantage, que l'exécution est defferer jusqu'à ce que vous vraiment commencer à énumérer le résultat et vous pouvez composer la requête avec d'autres requêtes et encore obtenir l'exécution côté serveur.

le problème est que vous ne pouvez pas contrôler la durée de vie du contexte de la 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 éliminé. Si vous retournez le résultat comme un List<T> , T[] , ou quelque chose de similaire, vous perdez l'exécution deffered et l'exécution côté serveur des requêtes composées, mais vous gagnez le contrôle sur 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 la moindre vérité.

22
répondu Daniel Brückner 2009-07-09 23:17:17

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

  • Si le IEnumerable<T> met en œuvre IQueryable<T> justs jette, à ne rien faire.
  • crée par ailleurs un "faux " IEnumerable<T> ( EnumerableQuery<T> ) qui implémente toutes les méthodes compilant les lambdas et appelant à des méthodes D'extension dénombrables.

donc, dans la plupart des cas, utiliser AsQueryable est inutile, à moins que u sont forcés de passer un IQueryable à une méthode et vous avez un IEnumerable à la place, c'est un hack.

REMARQUE: AsQueryable est un hack, IQueryable n'est évidemment pas!

9
répondu Olmo 2010-11-04 12:08:31

Returning IQueryable<T> reportera l'exécution de la requête jusqu'à ce que ses résultats soient réellement utilisés. D'ici là, 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é à des opérations en mémoire généralement moins efficaces.

4
répondu dahlbyk 2009-07-09 22:46:56