620 Stimmen

LINQ: Wann wird SingleOrDefault vs. FirstOrDefault() mit Filterkriterien verwendet?

Betrachten Sie die IEnumerable-Erweiterungsmethoden SingleOrDefault() et FirstOrDefault()

MSDN dokumentiert, dass SingleOrDefault :

Gibt das einzige Element einer Sequenz zurück oder einen Standardwert, wenn die Sequenz leer ist; diese Methode löst eine Ausnahme aus, wenn es mehr als ein Element in der Sequenz gibt.

während FirstOrDefault von MSDN (vermutlich bei Verwendung eines OrderBy() oder OrderByDescending() oder gar keine),

Gibt das erste Element einer Sequenz zurück

Bei einer Handvoll Beispielabfragen ist nicht immer klar, wann diese beiden Methoden zu verwenden sind:

var someCust = db.Customers
.SingleOrDefault(c=>c.ID == 5); //unlikely(?) to be more than one, but technically COULD BE

var bobbyCust = db.Customers
.FirstOrDefault(c=>c.FirstName == "Bobby"); //clearly could be one or many, so use First?

var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or does it matter?

Frage

Welche Konventionen befolgen Sie oder schlagen Sie vor bei der Entscheidung über die Verwendung SingleOrDefault() et FirstOrDefault() in Ihren LINQ-Abfragen?

10voto

spender Punkte 111351

Ich benutze SingleOrDefault in Situationen, in denen meine Logik vorschreibt, dass das Ergebnis entweder null oder eins sein wird. Wenn es mehr sind, handelt es sich um eine Fehlersituation, was hilfreich ist.

5voto

Olli Punkte 1865

In Ihrem Fall würde ich folgendes verwenden:

select by ID==5: es ist OK, hier SingleOrDefault zu verwenden, weil Sie eine [oder keine] Entität erwarten, wenn Sie mehr als eine Entität mit ID 5 haben, ist etwas falsch und definitiv eine Ausnahme wert.

bei der Suche nach Personen, deren Vorname "Bobby" ist, kann es mehr als eine geben (sehr wahrscheinlich, würde ich meinen), daher sollten Sie weder "Single" noch "First" verwenden, sondern nur mit der Where-Operation auswählen (wenn "Bobby" zu viele Entitäten liefert, muss der Benutzer seine Suche verfeinern oder eines der zurückgegebenen Ergebnisse auswählen)

die Reihenfolge nach Erstellungsdatum sollte auch mit einer Where-Operation durchgeführt werden (es ist unwahrscheinlich, dass Sie nur eine Entität haben, die Sortierung würde nicht viel nützen ;) dies setzt jedoch voraus, dass Sie ALLE Entitäten sortiert haben wollen - wenn Sie nur eine wollen, verwenden Sie FirstOrDefault, Single würde jedes Mal ausfallen, wenn Sie mehr als eine Entität haben.

5voto

Steven Punkte 51

SingleOrDefault: Sie sagen, dass es "höchstens" ein Element gibt, das der Abfrage oder dem Standard entspricht FirstOrDefault: Sie sagen, dass es "mindestens" ein Element gibt, das der Abfrage oder der Vorgabe entspricht

Sagen Sie das laut, wenn Sie das nächste Mal eine Wahl treffen müssen, und Sie werden wahrscheinlich weise wählen :)

4voto

Sheo Dayal Singh Punkte 1405

Beide sind die Elementoperatoren und werden verwendet, um ein einzelnes Element aus einer Folge auszuwählen. Es gibt jedoch einen kleinen Unterschied zwischen ihnen. Der Operator SingleOrDefault() würde eine Ausnahme auslösen, wenn mehr als ein Element die Bedingung erfüllt, während FirstOrDefault() keine Ausnahme für dasselbe auslöst. Hier ist das Beispiel.

List<int> items = new List<int>() {9,10,9};
//Returns the first element of a sequence after satisfied the condition more than one elements
int result1 = items.Where(item => item == 9).FirstOrDefault();
//Throw the exception after satisfied the condition more than one elements
int result3 = items.Where(item => item == 9).SingleOrDefault();

3voto

bytebender Punkte 7216

In Ihrem letzten Beispiel:

var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or doesn't matter?

Ja, das tut es. Wenn Sie versuchen, die SingleOrDefault() und die Abfrage mehr als einen Datensatz ergibt, würden Sie eine Ausnahme erhalten. Die einzige Zeit, die Sie sicher verwenden können SingleOrDefault() ist, wenn man nur 1 und nur 1 Ergebnis erwartet...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X