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.

David.Chu.ca
la source
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 :)

leppie
la source
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

Noich
la source
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 )

JP Alioto
la source
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
16

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

Paul van Brenk
la source
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;)

kay.one
la source
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.

Spence
la source
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
6

Il ne lèvera pas d'exception, vous obtiendrez une liste vide.

Jimmy Chandra
la source