Cosa restituisce LINQ quando i risultati sono vuoti


319

Ho una domanda sulla query LINQ. Normalmente una query restituisce un IEnumerable<T>tipo. Se il reso è vuoto, non sono sicuro che sia nullo o meno. Non sono sicuro se quanto segue ToList()genererà un'eccezione o solo un vuoto List<string>se non viene trovato nulla nel IEnumerablerisultato?

   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();

So che è una domanda molto semplice, ma per ora non ho VS disponibile.


11
Immagino che il risultato sia Enumerable.Empty?
David.Chu.ca,

Risposte:


512

Restituirà un enumerabile vuoto. Non sarà nullo. Puoi dormire l'audio :)


38

Puoi anche controllare il .Any()metodo:

if (!YourResult.Any())

Solo una nota che .Anyrecupererà comunque i record dal database; fare un .FirstOrDefault()/.Where()sarà tanto sovraccarico ma si sarebbe quindi in grado di catturare gli oggetti restituiti dalla query


5
Dove la domanda menziona un database?
cja

4
Dovrai chiedere a chi ha modificato, non ho menzionato alcun DB :)
Noich,

L'editor dei punti sta realizzando un suono, comunque, DB o no. Credo che stiano dicendo .Any()che ti diranno se hai dei record corrispondenti, dove fare una vera query per trovare un valore specifico potrebbe essere nullo quando .Any()non lo è.
Vapcguy,

1
La modifica potrebbe effettivamente essere errata. Se si utilizza linq alle entità, il db potrebbe abbreviare questo e nessun dato viene inviato al client tranne un vero o falso
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

(Il dump proviene da LinqPad )


Esattamente! Ottieni una migliore indicazione dei risultati
Netfed

TIL Count()è anche un metodo, non solo la proprietà
heyNow,

2
Non dovresti usare .Any () perché il conteggio enumererà tutti gli elementi?
SHEePYTaGGeRNeP


8

In Linq-to-SQL se si tenta di ottenere il primo elemento in una query senza risultati, si otterrà un sequence contains no elementserrore. Posso assicurarti che l'errore menzionato non è uguale a object reference not set to an instance of an object. in conclusione no, non restituirà null poiché null non può dire sequence contains no elementsche dirà sempre object reference not set to an instance of an object;)


1
Oh, la tua spiegazione aiuta a capire meglio. Grazie !
Kay Lee,

Questo risponde alla domanda?
ChiefTwoPencils,

7

Altri post qui hanno chiarito che il risultato è un IQueryable "vuoto", che ToList () cambierà correttamente in un elenco vuoto ecc.

Fai attenzione con alcuni degli operatori, in quanto lanceranno se invii loro un enumerabile vuoto. Questo può accadere quando li incateni insieme.


3
"Fai attenzione con alcuni degli operatori, in quanto lanceranno se invii loro un elenco numerato vuoto. Ciò può accadere quando li incateni insieme." - Questo è quello che mi ha preso. Ho restituito un valore null che ho quindi inserito in un'altra query. Ciò ha causato il lancio della seconda query, indipendentemente da cosa la abbia lanciata perché non è stato inserito alcun valore nella seconda query.
trevorc,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.