Que renvoie LINQ lorsque les résultats sont vides


319

J'ai une question concernant la requête LINQ. Normalement, une requête renvoie un IEnumerable<T>type. Si le retour est vide, vous ne savez pas s'il est nul ou non. Je ne sais pas si ce qui suit ToList()lèvera une exception ou juste un vide List<string>si rien ne se trouve dans le IEnumerablerésultat?

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

Je sais que c'est une question très simple, mais je n'ai pas de VS disponible pour le moment.


11
Je suppose que le résultat est Enumerable.Vide?
David.Chu.ca

Réponses:


512

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


38

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

if (!YourResult.Any())

Juste une note qui .Anyva quand même récupérer les enregistrements de la base de données; faire un .FirstOrDefault()/.Where()sera tout autant de surcharge mais vous pourrez alors attraper le ou les objets retournés par la requête


5
Où la question mentionne-t-elle une base de données?
2013

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

L'éditeur de points est sain, DB ou non. Je pense qu'ils disent .Any()que cela va juste vous dire si vous avez des enregistrements correspondants, où faire une requête réelle pour trouver une valeur spécifique peut être nul quand ce .Any()n'est pas le cas.
vapcguy

1
L'édition peut en fait être erronée. Si vous utilisez linq vers des entités, la base de données peut raccourcir cela et aucune donnée n'est envoyée au client, sauf un vrai ou un faux
Mafii

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

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

(Le vidage est de LinqPad )


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

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

2
Ne devriez-vous pas utiliser .Any () car count comptera à travers tous les éléments?
SHEePYTaGGeRNeP


8

Dans Linq-to-SQL, si vous essayez d'obtenir le premier élément d'une requête sans résultat, vous obtiendrez une sequence contains no elementserreur. Je peux vous assurer que l'erreur mentionnée n'est pas égale à object reference not set to an instance of an object. en conclusion non, il ne renverra pas null puisque null ne peut pas dire sequence contains no elementsqu'il dira toujours object reference not set to an instance of an object;)


1
Oh, votre explication aide à mieux comprendre. Je vous remercie !
Kay Lee

Est-ce que cela répond à la question?
ChiefTwoPencils

7

D'autres articles ici ont indiqué clairement que le résultat est un IQueryable "vide", que ToList () changera correctement pour être une liste vide, etc.

Soyez prudent avec certains des opérateurs, car ils lanceront si vous leur envoyez un énumérable vide. Cela peut se produire lorsque vous les enchaînez.


3
"Soyez prudent avec certains des opérateurs, car ils jetteront si vous leur envoyez un énumérable vide. Cela peut se produire lorsque vous les enchaînez." - C'est ce qui m'a attiré. J'ai eu une valeur retournée nulle que j'ai ensuite introduite dans une autre requête. Cela a provoqué le lancement de la deuxième requête, quel que soit le cas, car aucune valeur n'a été introduite dans la deuxième requête.
trevorc

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.