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?

3voto

M G Punkte 39

So wie ich das jetzt verstehe, SingleOrDefault ist gut, wenn Sie nach Daten abfragen, die garantiert eindeutig sind, d.h. durch DB-Einschränkungen wie Primärschlüssel erzwungen werden.

Oder gibt es eine bessere Möglichkeit, den Primärschlüssel abzufragen?

Angenommen, mein TableAcc hat

AccountNumber - Primary Key, integer
AccountName
AccountOpenedDate
AccountIsActive
etc.

und ich möchte eine Abfrage für eine AccountNumber 987654 verwende ich

var data = datacontext.TableAcc.FirstOrDefault(obj => obj.AccountNumber == 987654);

1voto

Vasil Kosturski Punkte 131

Meiner Meinung nach FirstOrDefault wird häufig überstrapaziert. In den meisten Fällen, in denen Daten gefiltert werden, erwartet man entweder eine Sammlung von Elementen, die der logischen Bedingung entsprechen, oder ein einzelnes, eindeutiges Element anhand seiner eindeutigen Kennung - z. B. ein Benutzer, ein Buch, ein Beitrag usw.. Deshalb können wir sogar so weit gehen zu sagen, dass FirstOrDefault() ist ein Codegeruch, nicht weil er falsch ist, sondern weil er viel zu oft verwendet wird. Dieser Blogbeitrag erforscht das Thema im Detail. IMO die meisten der Zeiten SingleOrDefault() ist eine viel bessere Alternative. Achten Sie also auf diesen Fehler und stellen Sie sicher, dass Sie die am besten geeignete Methode verwenden, die Ihren Vertrag und Ihre Erwartungen klar darstellt.

0voto

El Dude Punkte 11

Eine Sache, die in den Antworten fehlt....

Wenn es mehrere Ergebnisse gibt, kann FirstOrDefault ohne eine Reihenfolge nach unterschiedliche Ergebnisse liefern, je nachdem, welche Indexstrategie der Server verwendet hat.

Ich persönlich kann es nicht ausstehen, FirstOrDefault im Code zu sehen, weil es für mich bedeutet, dass sich der Entwickler nicht um die Ergebnisse gekümmert hat. Mit einer Reihenfolge, obwohl es nützlich sein kann, als eine Möglichkeit der Erzwingung der neuesten/frühesten. Ich musste schon viele Probleme korrigieren, die durch unvorsichtige Entwickler mit FirstOrDefault verursacht wurden.

0voto

PinoyDev Punkte 759

Im Wesentlichen gibt dies Ihnen eine Art von Validierung, um Ihre Daten zu bereinigen, wenn Sie eine über die andere es beide die Daten geben, aber SingleOrDefault wird Sie erkennen, dass, wenn die Daten, die Sie erwarten, sollte nur 1 Ergebnis und spuckt mehr 1 dann müssen Sie einen Blick auf, warum Ihre gespeicherte Prozedur oder Abfrage in solchen führte, doppelte Elemente sind nie gut in Abfragen sowieso.

-3voto

Fred Punkte 11162

Ich habe Google nach der Verwendung der verschiedenen Methoden auf GitHub befragt. Dazu wird eine Google-Suchanfrage für jede Methode durchgeführt und die Abfrage auf die Domäne github.com und die Dateierweiterung .cs beschränkt, indem die Abfrage "site:github.com file:cs ..." verwendet wird.

Es scheint, dass die First*-Methoden häufiger verwendet werden als die Single*-Methoden.

| Method               | Results |
|----------------------|---------|
| FirstAsync           |     315 |
| SingleAsync          |     166 |
| FirstOrDefaultAsync  |     357 |
| SingleOrDefaultAsync |     237 |
| FirstOrDefault       |   17400 |
| SingleOrDefault      |    2950 |

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