Ich habe mich umgesehen und keine klare Antwort gefunden, wann Sie .First
und wann Sie .FirstOrDefault
mit LINQ verwenden möchten.
Wann möchten Sie .First
verwenden? Nur wenn Sie die Ausnahme abfangen möchten, wenn keine Ergebnisse zurückgegeben wurden?
var result = List.Where(x => x == "foo").First();
Und wann möchten Sie .FirstOrDefault
verwenden? Wann möchten Sie immer den Standardtyp, wenn kein Ergebnis erzielt wird?
var result = List.Where(x => x == "foo").FirstOrDefault();
Und was ist mit Take?
var result = List.Where(x => x == "foo").Take(1);
Ich würde First()
verwenden, wenn ich weiß oder erwarte, dass die Sequenz mindestens ein Element enthält. Mit anderen Worten, wenn die Sequenz in Ausnahmefällen leer ist.
Verwenden Sie FirstOrDefault()
, wenn Sie wissen, dass Sie überprüfen müssen, ob ein Element vorhanden ist oder nicht. Mit anderen Worten, wenn es legal ist, dass die Sequenz leer ist. Sie sollten sich bei der Prüfung nicht auf die Ausnahmebehandlung verlassen. (Es ist eine schlechte Übung und kann die Leistung beeinträchtigen.).
Schließlich besteht der Unterschied zwischen First()
und Take(1)
darin, dass First()
das Element selbst zurückgibt, während Take(1)
eine Folge von Elementen zurückgibt, die genau ein Element enthält.
.First
löst eine Ausnahme aus, wenn keine Ergebnisse vorliegen. .FirstOrDefault
gibt entweder null (Referenztypen) oder den Standardwert des Werttyps zurück. (z. B. wie 0
für ein Int.) Die Frage hier ist nicht, wann Sie den Standardtyp möchten, sondern mehr: Sind Sie bereit, eine Ausnahme oder einen Standardwert zu behandeln? Da Ausnahmen außergewöhnlich sein sollten, wird FirstOrDefault
bevorzugt, wenn Sie nicht sicher sind, ob Ihre Abfrage zu Ergebnissen führen wird. Wenn die Daten logischerweise vorhanden sein sollten, kann die Ausnahmebehandlung in Betracht gezogen werden.
Skip()
und Take()
werden normalerweise beim Einrichten von Paging in Ergebnissen verwendet. (Wie das Anzeigen der ersten 10 Ergebnisse und der nächsten 10 auf der nächsten Seite usw.)
Hoffe das hilft.
.First()
löst eine Ausnahme aus, wenn keine Zeile zurückgegeben werden soll, während .FirstOrDefault()
stattdessen den Standardwert (NULL
für alle Referenztypen) zurückgibt.
Wenn Sie also bereit und gewillt sind, eine mögliche Ausnahme zu behandeln, ist .First()
in Ordnung. Wenn Sie ohnehin den Rückgabewert für != null
überprüfen möchten, ist .FirstOrDefault()
Ihre bessere Wahl.
Aber ich denke, es ist auch eine persönliche Vorliebe. Verwenden Sie, was für Sie sinnvoller ist und besser zu Ihrem Codierungsstil passt.
First ()
FirstOrDefault ()
Wir haben eine UserInfos-Tabelle, die einige Datensätze enthält, wie unten gezeigt. Anhand dieser Tabelle habe ich ein Beispiel erstellt ...
Wie benutzt man First ()
var result = dc.UserInfos.First(x => x.ID == 1);
Es gibt nur einen Datensatz, in dem ID == 1. Sollte diesen Datensatz zurückgeben
ID: 1 Vorname: Manish Nachname: Dubey E-Mail: [email protected]
var result = dc.UserInfos.First(x => x.FName == "Rahul");
Es gibt mehrere Datensätze, in denen FName == "Rahul" ist. Der erste Datensatz sollte zurückgegeben werden.
ID: 7 Vorname: Rahul Nachname: Sharma E-Mail: [email protected]
var result = dc.UserInfos.First(x => x.ID ==13);
Es gibt keinen Datensatz mit der ID == 13. Es sollte ein Fehler auftreten.
InvalidOperationException: Die Sequenz enthält keine Elemente
Verwendung von FirstOrDefault ()
var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);
Es gibt nur einen Datensatz, in dem ID == 1. Sollte diesen Datensatz zurückgeben
ID: 1 Vorname: Manish Nachname: Dubey E-Mail: [email protected]
var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");
Es gibt mehrere Datensätze, in denen FName == "Rahul" ist. Der erste Datensatz sollte zurückgegeben werden.
ID: 7 Vorname: Rahul Nachname: Sharma E-Mail: [email protected]
var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);
Es gibt keinen Datensatz mit der ID == 13. Der Rückgabewert ist null
Hoffe, es wird Ihnen helfen, zu verstehen, wann Sie First()
oder FirstOrDefault()
verwenden müssen.
Erstens ist Take
eine völlig andere Methode. Es gibt einen IEnumerable<T>
und keinen einzelnen T
zurück, das ist also out.
Zwischen First
und FirstOrDefault
sollten Sie First
verwenden, wenn Sie sicher sind, dass ein Element vorhanden ist, und wenn dies nicht der Fall ist, liegt ein Fehler vor.
Wenn Ihre Sequenz übrigens default(T)
Elemente enthält (z. B. null
) und Sie zwischen leer und dem ersten Element null
unterscheiden müssen, können Sie FirstOrDefault
nicht verwenden.
Zuerst:
FirstOrDefault:
Von: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
Ein weiterer Unterschied besteht darin, dass Sie beim Debuggen einer Anwendung in einer Produktionsumgebung möglicherweise keinen Zugriff auf Zeilennummern haben. Daher kann es schwierig sein, festzustellen, welche bestimmte .First()
-Anweisung in einer Methode die Ausnahme ausgelöst hat.
Die Ausnahmemeldung enthält auch keine Lambda-Ausdrücke, die Sie möglicherweise verwendet haben, wodurch das Debuggen von Problemen noch schwieriger wird.
Deshalb verwende ich immer FirstOrDefault()
, obwohl ich weiß, dass ein Null-Eintrag eine Ausnahmesituation darstellen würde.
var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
throw new Exception(string.Format("Can't find customer {0}.", customerId));
}
First ()
Wenn Sie wissen, dass das Ergebnis mehr als 1 Element enthält, sollten Sie nur das erste Element der Sequenz erwarten.
FirstOrDefault ()
FirstOrDefault () ist genau wie First (), außer dass, wenn kein Element der angegebenen Bedingung entspricht, der Standardwert des zugrunde liegenden Typs der generischen Auflistung zurückgegeben wird. InvalidOperationException wird nicht ausgelöst, wenn kein Element gefunden wird. Die Auflistung eines Elements oder einer Sequenz ist jedoch null, als sie eine Ausnahme auslöst.
Ich habe eine Website gefunden, die die Notwendigkeit von FirstOrDefault erklärt
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Wenn eine Abfrage keine Ergebnisse liefert und Sie First () oder Single () aufrufen möchten, um eine einzelne Zeile abzurufen ... wird die Ausnahme "Sequenz enthält keine Elemente" angezeigt.
Haftungsausschluss: Ich habe noch nie LINQ verwendet. Ich entschuldige mich, wenn dies nicht der Fall ist.
Diese Art der Funktion gehört zu Elementoperatoren. Einige nützliche Elementoperatoren sind unten definiert.
Wir verwenden Elementoperatoren, wenn wir ein einzelnes Element aus einer Sequenz basierend auf einer bestimmten Bedingung auswählen müssen. Hier ist ein Beispiel.
List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9, 2, 10 };
Der Operator First () gibt das erste Element einer Sequenz zurück, nachdem die Bedingung erfüllt wurde. Wird kein Element gefunden, wird eine Ausnahme ausgelöst.
int result = items.Where (item => item == 2) .First ();
Der Operator FirstOrDefault () gibt das erste Element einer Sequenz zurück, nachdem die Bedingung erfüllt wurde. Wird kein Element gefunden, wird der Standardwert dieses Typs zurückgegeben.
int result1 = items.Where (item => item == 2) .FirstOrDefault ();
someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)
Welches verwenden? Es sollte von der Geschäftslogik entschieden werden und nicht von der Angst vor Ausnahmen/Programmfehlern.
Zum Beispiel, wenn die Geschäftslogik besagt, dass wir an keinem Arbeitstag null Transaktionen haben können (Nehmen Sie einfach an). Dann sollten Sie nicht versuchen, dieses Szenario mit einer intelligenten Programmierung zu bewältigen. Ich werde First () immer über eine solche Sammlung verwenden und das Programm fehlschlagen lassen, wenn etwas anderes die Geschäftslogik durcheinander bringt.
Code:
var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()
Ich würde gerne andere Kommentare dazu sehen.
Ok, lass mich meine zwei Cent geben. First/Firstordefault gibt an, wann Sie den zweiten Konstruktor verwenden. Ich werde nicht erklären, was es ist, aber es ist, wenn Sie möglicherweise immer eine verwenden würden, weil Sie keine Ausnahme verursachen möchten.
person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
return string.IsNullOrEmpty(p.Relationship);
}));