2009-07-28 4 views
229

J'ai une question à propos de la requête LINQ. Normalement, une requête renvoie un type IEnumerable. Si le retour est vide, je ne sais pas si c'est nul ou non. Je ne suis pas sûr si le suivant ToList() lèvera une exception ou juste une liste vide < chaîne > si rien trouvé dans le résultat IEnumerable? Je sais que c'est une question très simple, mais je n'ai pas de VS disponible pour l'instant.Que retourne LINQ lorsque les résultats sont vides?

+7

Je suppose que le résultat est Enumerable.Empty? –

Répondre

369

Il renverra un nombre énumérable vide. Ce ne sera pas nul. Vous pouvez dormir le son :)

9

.ToList retourne une liste vide. (identique à la nouvelle liste());

3

Il ne lancera pas d'exception, vous obtiendrez une liste vide.

16
var lst = new List<int>() { 1, 2, 3 }; 
var ans = lst.Where(i => i > 3); 

(ans == null).Dump(); // False 
(ans.Count() == 0).Dump(); // True 

(Dump est de LinqPad)

+0

Exactement! Vous obtenez une meilleure indication des résultats – netfed

+0

TIL 'Count()' est également une méthode, pas seulement la propriété – heyNow

+0

Ne devriez-vous pas utiliser .Any() car count énumérera tous les éléments? – SHEePYTaGGeRNeP

5

D'autres messages ici ont clairement fait savoir que le résultat est un « vide » IQueryable qui ToList() va changer correctement être une liste vide etc.

Faites attention avec certains des opérateurs, car ils lanceront si vous leur envoyez une énumération vide. Cela peut arriver quand vous les enchaînez ensemble.

+1

"Faites attention avec certains des opérateurs, car ils lanceront si vous leur envoyez un nombre énumérable vide, ce qui peut arriver quand vous les enchaînez ensemble." - C'est ce qui m'a eu. J'avais une valeur retournée nulle que j'ai ensuite introduite dans une autre requête. Cela a provoqué la deuxième requête à lancer peu importe ce que je l'ai lancé car il n'y avait aucune valeur introduite dans la deuxième requête. – trevorc

6

dans LINQ to SQL si vous essayez d'obtenir le premier élément sur une requête sans résultats que vous obtiendrez sequence contains no elements erreur. Je peux vous assurer que l'erreur mentionnée n'est pas égale à object reference not set to an instance of an object. en guise de conclusion non, il ne reviendra pas nulle puisque nul ne peut dire sequence contains no elements ce sera toujours dire object reference not set to an instance of an object;)

+0

Oh, votre explication aide à mieux comprendre. Je vous remercie ! –

27

Vous pouvez également vérifier la méthode .Any():

if (!YourResult.Any()) 

Juste une note qui sera .Any toujours récupérer les enregistrements de la base de données; faire un .FirstOrDefault()/.Where() sera tout autant les frais généraux, mais vous seriez alors en mesure de saisir l'objet (s) est revenu de la requête

+4

Où la question mentionne-t-elle une base de données? – cja

+2

Vous devrez demander à celui qui a édité, je n'ai mentionné aucun DB :) – Noich

+0

L'éditeur de point fait est sain, cependant, DB ou pas. Je crois qu'ils disent '.Any()' va juste vous dire si vous avez des enregistrements correspondants, du tout, où faire une requête réelle pour trouver une valeur spécifique pourrait être nulle quand '.Any()' ne l'est pas. – vapcguy

Questions connexes