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?

-11voto

Theron Govender Punkte 97

Ich verstehe nicht, warum Sie die FirstOrDefault(x=> x.ID == key) wenn dies viel schneller zu Ergebnissen führen könnte, wenn Sie Find(key) . Wenn Sie eine Abfrage mit dem Primärschlüssel der Tabelle durchführen, gilt die Faustregel, dass Sie immer Find(key) . FirstOrDefault sollte für Prädikate verwendet werden wie (x=> x.Username == username) usw.

Dies verdiente keine Abwertung, da die Überschrift der Frage nicht spezifisch für Linq on DB oder Linq to List/IEnumerable usw. war.

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