2013-04-29 2 views
2

Bien qu'il soit nécessaire de basculer d'un pilote LINQ à un autre (par exemple parce que certaines expressions voulues peuvent ne pas être prises en charge dans le premier), quel type de commutateur doit être utilisé - AsEnumerable ou ToList?LINQ to SQL dans LINQ to Objects - basculer via AsEnumerable ou via ToList

var r = ent.Users.Select(user => new 
     { 
      user.Name, 
      Organs = user.Attributes.Select(x => x.Organ) 
     }) 
     .AsEnumerable() // switch to LINQ to Objects 
     .Select(user => new 
     { 
      user.Name, 
      Organs = string.Join(", ", user.Organs) 
     }); 

Je comprends que AsEnumerable est reporté, il n'énumèrent pas la source immédiatement, mais est-il une différence significative que le passage de l'utilisation de ToList ici, dans la pratique, au lieu?

Pour que LINQ to Objects s'exécute ici, les données de SQL doivent déjà être disponibles - c'est ce que fera ToList() s'il est utilisé à la place du commutateur. L'utilisation de AsEnumerable ne force-t-elle pas quelque chose comme ToList à être invoqué en interne de toute façon pendant l'évaluation de l'arbre d'expression?

+0

Vous devriez voir ceci: [whats-the-differences-between-tolist-asenumerable-asqueryable] (http://stackoverflow.com/questions/17968469/whats-the-differences-between-tolist-asenumerable-asqueryable) – nawfal

Répondre

5

.ToList() va construire un nouveau List<T> en mémoire et y stocker tous les objets.
C'est un travail inutile; vous devriez appeler .AsEnumerable().

En général, vous devez appeler .ToList() uniquement lorsque vous devez effectuer plusieurs itérations (et seulement à la fin d'une chaîne de requête).

0

Alors que @SLaks déjà répondu à votre question, par souci de clarté, je vais citer MSDN sur ce .AsEnumerable() fait:

La méthode AsEnumerable (IEnumerable) n'a pas d'effet autre que de changer la compilation type de source à l'heure d'un type que implémente IEnumerable à IEnumerable lui-même.

Il n'est pas associé à ToList().