Ich habe eine LINQ-Abfrage, die entweder ein einzelnes Ergebnis oder keine Ergebnisse zurückgeben soll. Ich rufe Single()
auf, um das Ergebnis wie folgt zu erhalten:
Dies funktioniert, wenn meine Abfrage ein einzelnes Ergebnis hat, aber wenn es keine Ergebnisse gibt, wird System.InvalidOperationException
mit der Nachricht Sequenz enthält keine Elemente .
Wie kann ich das beheben?
Verwenden Sie stattdessen SingleOrDefault
.
Single
löst eine Ausnahme bei der Aufzählung aus enthält nicht genau ein Element, SingleOrDefault<T>
gibt default(T)
(das ist null
für Referenztypen) wenn stattdessen leere Aufzählungen aufgerufen werden. Beachten Sie, dass beide Argumente ausgegeben werden, wenn mehr als ein Element in der Aufzählung vorhanden ist.
.SingleOrDefault()
gibt das einzelne übereinstimmende Objekt oder den Standardwert zurück (das ist null
für Referenztypen. Sie müssen jedoch selbst mit null
umgehen, weil Sie mit einem NullReferenceException
pretty enden schnell.
Als Randnotiz sollten Sie .Any()
anstelle von .Count() > 0
verwenden, um zu vermeiden, dass Sie bei Verwendung von IEnumerable
s über Ihre gesamte Datenmenge iterieren.
Single
wird vom Design aus ein Design erstellen Ausnahme, wenn die Sequenz leer ist. Verwenden Sie SingleOrDefault
, um null
bei Ihrer Sequenz zurückzugeben ist leer.
.FirstOrDefault()
gibt null (oder den Standardwert des Typs) zurück, wenn nichts existiert (keine Übereinstimmung gefunden), .Single()
erwartet genau eine Übereinstimmung. .SingleOrDefault()
wird null (oder den Standardwert des Typs) zurückgeben, wenn nichts existiert, aber eine Ausnahme auslöst, wenn Sie mehr als eine Übereinstimmung haben.