2009-07-17 7 views

Répondre

0

transactions: Abstraction faite

using (PlayerDataContext context = new PlayerDataContext()) 
{ 
    var players = context.Players.ToList(); 
    MethodThatUnexpectedlyTakes25SecondsToComplete(); 
    Console.WriteLine(players.Count()); // Outputs a stale count 
} 
+0

Je ne vois pas vraiment comment cela est une "chasse aux sorcières". ToList() copie clairement les entités des joueurs dans une liste . C'est ce que fait ToList sur tout IEnumerable. –

+1

Je ne suis pas d'accord pour dire que c'est obsolète ... c'est un 100% à jour du nombre d'éléments dans la liste, ce que vous lui avez demandé de faire ... ce sont juste des données déconnectées. –

+0

En outre, je dirais qu'il produit un compte périmé (ne pourrait pas le faire). Le fait que le nombre éventé puisse coïncider avec le nombre réel est à côté du point. –

1

Le grand est la perte d'exécution différée. Une requête linq ne fait normalement rien tant que vous n'avez pas fait d'itération sur les résultats. Appeler .ToList() itère sur les résultats, et va donc exécuter la requête tout de suite.

0

Compromettre LINQ-to-sql la capacité d'optimiser:

using (PlayerDataContext context = new PlayerDataContext()) 
{ 
    // suboptimal 
    var players = context.Players.ToList(); 
    Console.WriteLine(players.Count()); 

    // optimal 
    var playerCount = context.Players.Count(); 
    Console.WriteLine(playerCount); 
} 
+0

C'est super évident ... ce n'est pas un gotchya ... – jjnguy

+1

jjnguy -Vous seriez surpris. Je le vois beaucoup dans notre code de production. –

Questions connexes