2015-07-23 4 views
2

Je suis en train d'optimiser l'accès DB et je me suis posé des questions sur l'exécution différée. J'ai déjà appris que SomeQueriable.Count() est beaucoup plus efficace que SomeQueriable.ToList().Count ou SomeQueriable.ToArray().Length, car il utilise la méthode natif DB COUNT.exécution LINQ et différée lors de la comparaison avec NULL

Mais qu'en est-il du résultat de la recherche lui-même? Lorsque je veux comparer le résultat de la requête à null, y a-t-il une différence entre SomeQueriable == null et SomeQueriable.ToList() == null?

En outre, utilise SomeQueriable.Count() sûr, ou dois-je toujours vérifier null? En d'autres termes, est

if (SomeQueriable == null || SomeQueriable.Count() == 0) 

le même que

if (SomeQueriable.Count() == 0) 

ou sera la dernière cause une exception, lorsqu'il n'y a pas de recherche infructueuse?

+0

Si 'SomeQueriable' est une requête réelle et n'est pas explicitement affectée à une valeur nulle, vous n'avez pas besoin de vérifier null. – Magnus

+0

Bien sûr, il y a une différence, car 'SomeQueriable.ToList() == null' lancera un NRE quand 'SomeQueriable' est' Null'. Cependant, il n'est généralement pas nécessaire de vérifier l'un de ceux-ci, car aucune méthode LINQ ne renvoie "null" comme résultat. – HimBromBeere

+0

'db.TableName.ToList(). Count' charge la totalité de la table de base de données en mémoire juste pour obtenir le nombre d'éléments. Bien sûr, c'est inefficace. Mais si vous en avez ou avez besoin de toute façon, il est préférable d'utiliser la propriété 'List.Count' au lieu d'utiliser une requête' Count() 'séparée. De même, 'someThing.ToList()' ** never ** retourne 'null' mais une liste vide. –

Répondre

2

SomeQueriable représente un arbre d'expression jusqu'à ce que vous appeliez ToList. Lorsque vous évaluez SomeQueriable == null, vous vérifiez si l'arborescence d'expression est null. Lorsque vous évaluez SomeQueriable.ToList() == null vous vérifiez si le résultat de la requête est null ce qui, je ne pense pas que ce sera jamais - je pense renvoie une collection vide qui est plus idiomatique.

L'appel SomeQueriable.Count() est null-safe tant que SomeQueriable est définitivement assignée. Tout comme si elle a la possibilité d'être null, ajoutez un chèque nul ou utiliser le null-conditional operator en C# 6.

0

Non, vous devez vérifier null, toute autre variable, comme vous pouvez le voir dans le source code here:

public static int Count<TSource>(this IEnumerable<TSource> source) 
    { 
     if (source == null) throw Error.ArgumentNull("source"); 
0

Il n'y a pas un tel cas où vous recevriez SomeQueriable.ToList() égal null. Cette méthode renvoie toujours une collection. Même si vous avez oublié d'attribuer SomeQueriable à une certaine valeur, vous obtiendrez NullReferenceException. À mon avis, de tels contrôles sur la référence nulle devraient être délimités autant que possible pendant le développement afin que votre code puisse être lu plus clairement.

Par conséquent, vous devez vous assurer que vous avez attribué SomeQueriable avec une requête et si vous voulez vérifier si vous avez reçu des résultats - s'il vous plaît utiliser .Any()

if (SomeQueriable.Any()) 

Mais notez que l'exécution différée pourrait être parfois difficile . Si vous avez besoin résultats de recherche et vérifier leur existance - il est préférable d'exécuter la requête, par exemple en appelant .ToList() puis effectuez vos chèques:

var results = SomeQueriable.ToList(); 
var isAnyResults = results.Any(); 

Parce que si vous exécutez inverse (d'abord .Any() puis .ToList()) - Je finirai par exécuter deux fois la même requête.