2009-07-28 22 views
229

Ho una domanda sulla query LINQ. Normalmente una query restituisce un tipo IEnumerable. Se il reso è vuoto, non è sicuro se è nullo o meno. Non sono sicuro che la seguente ToList() genererà un'eccezione o solo una stringa vuota < > se non viene trovato nulla nel risultato IEnumerable?Cosa restituisce LINQ quando i risultati sono vuoti

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 non ho VS disponibile per il momento.

+7

Immagino che il risultato sia Enumerable.Empty? –

risposta

369

Restituirà un numero enumerabile vuoto. Non sarà nulla. È possibile sospendere il suono :)

9

. ListaLista restituisce una lista vuota. (come la nuova List());

3

Non farà eccezione, si otterrà una lista vuota.

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 

(discarica è da LinqPad)

+0

Esattamente! Si ottiene una migliore indicazione dei risultati – netfed

+0

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

+0

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

5

Altri post qui hanno chiarito che il risultato è un "vuoto" IQueryable, che ToList() sarà correttamente cambiate essere un elenco vuoto ecc

Fare attenzione ad alcuni degli operatori, in quanto generano se si inviano enumerabili vuoti. Questo può accadere quando li si incatena.

+1

"Fai attenzione ad alcuni degli operatori, perché potrebbero lanciarli se li invii a enumerabili vuoti, questo può accadere quando li unisci insieme". - Questo è quello che mi ha preso. Ho avuto un valore restituito nullo che ho poi inserito in un'altra query. Ciò ha causato il lancio della seconda query, indipendentemente da cosa l'avessi inoltrata perché non c'era alcun valore inserito nella seconda query. – trevorc

6

In Linq-to-SQL se si tenta di ottenere il primo elemento in una query senza risultati, verrà visualizzato l'errore sequence contains no elements. Posso assicurarti che l'errore citato non è uguale a object reference not set to an instance of an object. in conclusione no, non tornerà nulla dal momento che nulla non si può dire sequence contains no elements sarà sempre dire object reference not set to an instance of an object;)

+0

Oh, la tua spiegazione aiuta a capire meglio. Grazie ! –

27

è anche possibile controllare il metodo .Any():

if (!YourResult.Any()) 

Solo una nota che sarà .Any ancora recuperare i record dal database; fare un .FirstOrDefault()/.Where() sarà altrettanto sovraccarico, ma si sarebbe quindi in grado di catturare l'oggetto (s) restituito dalla query

+4

Dove la domanda menziona un database? – cja

+2

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

+0

L'editor di punti è in esecuzione, tuttavia, DB o no. Credo che stiano dicendo '. Any()' ti dirà solo se hai dei record corrispondenti, dove una query effettiva per trovare un valore specifico potrebbe essere nulla quando '.Any()' non lo è. – vapcguy

Problemi correlati