2014-01-17 12 views
8

Ich habe eine LINQ-Abfrage, die entweder ein einzelnes Ergebnis oder keine Ergebnisse zurückgeben sollte. Ich nenne Single() das Ergebnis wie folgt zu erhalten:Überprüfen Sie, ob single() LINQ NULL zurückgeben

var propertyDataSource = (from x in myCollection 
          where SomeCondition(x) 
          select x).Single(); 

Diese Ordnung funktioniert, wenn meine Abfrage ein einzelnes Ergebnis, aber wenn es keine Ergebnisse gibt es wirft eine System.InvalidOperationException mit der Meldung Sequenz keine Elemente enthält.

Wie kann ich das beheben?

Antwort

22

verwenden SingleOrDefault statt.

Single löst eine Ausnahme aus, wenn die Enumeration nicht genau ein Element enthält. SingleOrDefault<T> gibt default(T) (null für Referenztypen) zurück, wenn stattdessen leere Enumerationen aufgerufen werden. Beachten Sie, dass beide Elemente ausgelöst werden, wenn mehr als ein Element in der Enumeration vorhanden ist.

5

Standardmäßig wird Single eine Ausnahme auslösen, wenn die Sequenz leer ist. Verwenden Sie SingleOrDefault, um null zurückzugeben, wenn Ihre Sequenz leer ist.

7

.SingleOrDefault() kehren das einzig passende Objekt oder den Standardwert (die null für Referenztypen ist. Sie werden den null Fall selbst wenn zu handhaben, weil Sie mit einem NullReferenceException ziemlich schnell am Ende dann.

Wie eine Randnotiz, sollten Sie .Any() statt .Count() > 0 zu vermeiden Iterieren über den gesamten Datenmenge verwenden bei der Verwendung von IEnumerable s.

5

.FirstOrDefault() gibt null (oder Standard des Typs) zurück, wenn nichts existiert (keine Übereinstimmung gefunden), .Single() wird genau eine Übereinstimmung erwarten. .SingleOrDefault() gibt null (oder den Standardwert des Typs) zurück, wenn nichts vorhanden ist, aber eine Ausnahme auslöst, wenn Sie mehr als eine Übereinstimmung haben.

Verwandte Themen