Was gibt LINQ zurück, wenn die Ergebnisse leer sind?


319

Ich habe eine Frage zur LINQ-Abfrage. Normalerweise gibt eine Abfrage einen IEnumerable<T>Typ zurück. Wenn die Rückgabe leer ist, ist nicht sicher, ob sie null ist oder nicht. Ich bin nicht sicher, ob das Folgende ToList()eine Ausnahme auslöst oder nur eine leere, List<string>wenn nichts im IEnumerableErgebnis gefunden wird.

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

Ich weiß, dass es eine sehr einfache Frage ist, aber ich habe derzeit kein VS zur Verfügung.


11
Ich denke, das Ergebnis ist Enumerable.Empty?
David.Chu.ca

Antworten:


512

Es wird eine leere Aufzählung zurückgegeben. Es wird nicht null sein. Du kannst gut schlafen :)


38

Sie können auch die .Any()Methode überprüfen :

if (!YourResult.Any())

Nur eine Notiz, .Anymit der die Datensätze weiterhin aus der Datenbank abgerufen werden. Das Ausführen von a .FirstOrDefault()/.Where()ist genauso viel Aufwand, aber Sie können dann die von der Abfrage zurückgegebenen Objekte abfangen


5
Wo erwähnt die Frage eine Datenbank?
Cja

4
Sie müssen denjenigen fragen, der bearbeitet hat, ich habe keine DB erwähnt :)
Noich

Der Punkteditor macht zwar Sound, DB oder nicht. Ich glaube, sie sagen, dass sie .Any()Ihnen nur sagen werden, ob Sie überhaupt übereinstimmende Datensätze haben, bei denen eine tatsächliche Abfrage zum Finden eines bestimmten Werts möglicherweise null ist, wenn dies .Any()nicht der Fall ist.
Vapcguy

1
Die Bearbeitung könnte tatsächlich falsch sein. Wenn Sie linq für Entitäten verwenden, kann die Datenbank dies verkürzen, und es werden überhaupt keine Daten an den Client gesendet, außer wahr oder falsch
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

(Dump ist von LinqPad )


Genau! Sie erhalten einen besseren Hinweis auf die Ergebnisse
netfed

TIL Count()ist auch eine Methode, nicht nur die Eigenschaft
heyNow

2
Sollten Sie nicht .Any () verwenden, da count alle Elemente auflistet?
SHEePYTaGGeRNeP


8

Wenn Sie in Linq-to-SQL versuchen, das erste Element in einer Abfrage ohne Ergebnisse abzurufen, wird eine sequence contains no elementsFehlermeldung angezeigt. Ich kann Ihnen versichern, dass der erwähnte Fehler nicht gleich ist object reference not set to an instance of an object. abschließend nein, es wird nicht null zurückgegeben, da null nicht sagen kann, dass sequence contains no elementses immer sagen wird object reference not set to an instance of an object;)


1
Oh, deine Erklärung hilft beim weiteren Verständnis. Vielen Dank !
Kay Lee

Beantwortet dies die Frage?
ChiefTwoPencils

7

Andere Beiträge hier haben deutlich gemacht, dass das Ergebnis eine "leere" IQueryable ist, die ToList () korrekt in eine leere Liste usw. ändert.

Seien Sie vorsichtig mit einigen Operatoren, da diese werfen, wenn Sie ihnen eine leere Aufzählung senden. Dies kann passieren, wenn Sie sie miteinander verketten.


3
"Seien Sie vorsichtig mit einigen Operatoren, da diese werfen, wenn Sie ihnen eine leere Aufzählung senden. Dies kann passieren, wenn Sie sie miteinander verketten." - Das hat mich erwischt. Ich hatte einen Null-Rückgabewert, den ich dann in eine andere Abfrage eingespeist habe. Dies führte dazu, dass die zweite Abfrage unabhängig von dem, in den ich sie umgewandelt habe, ausgelöst wurde, da der zweiten Abfrage kein Wert zugeführt wurde.
Trevorc

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.