it-swarm.com.de

Entity Framework 4 Single () vs First () vs FirstOrDefault ()

Es ist mir ein Rätsel, einen Vergleich der verschiedenen Möglichkeiten zur Abfrage eines einzelnen Elements zu finden und zu ermitteln, wann die einzelnen Elemente verwendet werden sollen.

Hat jemand einen Link, der all diese vergleicht, oder eine kurze Erklärung, warum Sie einen über den anderen verwenden würden? Gibt es noch weitere Betreiber, die mir unbekannt sind?

Vielen Dank.

109
asfsadf

Hier eine Übersicht der verschiedenen Methoden:

  • Find () - wenn Sie ein Objekt über den Primärschlüssel erhalten möchten. Dies gibt null zurück, wenn ein Element nicht gefunden werden kann. Es wird im Kontext nachgesehen, bevor Sie zur Datenbank gehen (wie von Yaron in den Kommentaren hervorgehoben). Dies kann ein wichtiger Effizienzfaktor sein, wenn Sie dieselbe Entität mehrmals abrufen müssen, während derselbe Kontext aktiv ist.

  • Single () - Wenn Sie erwarten, dass genau ein Element von einer Abfrage zurückgegeben wird. Dies löst eine Ausnahme aus, wenn die Abfrage nicht genau ein Element zurückgibt.

  • SingleOrDefault () - Wenn Sie erwarten, dass keine oder eine Nachricht von einer Abfrage zurückgegeben wird (d. H. Wenn Sie nicht sicher sind, ob eine Nachricht mit einem bestimmten Schlüssel vorhanden ist). Dies löst eine Ausnahme aus, wenn die Abfrage keine oder keine Elemente zurückgibt.

  • First () - Wenn Sie erwarten, dass ein oder mehrere Artikel von einer Abfrage zurückgegeben werden, Sie jedoch nur auf den ersten Artikel in Ihrem Code zugreifen möchten (die Reihenfolge kann hier für die Abfrage wichtig sein). Dies löst eine Ausnahme aus, wenn die Abfrage nicht mindestens ein Element zurückgibt.

  • FirstOrDefault () - Wenn Sie erwarten, dass keine oder mehrere Artikel von einer Abfrage zurückgegeben werden, Sie jedoch nur auf den ersten Artikel in Ihrem Code zugreifen möchten (d. H. Wenn Sie nicht sicher sind, ob ein Artikel mit einem bestimmten Schlüssel vorhanden ist)

192
Steve Willcock

Ich neige immer dazu, FirstOrDefault zu verwenden. Wenn Sie wirklich mit der Leistung wählerisch sein möchten, sollten Sie FirstOrDefault in EF verwenden. Unter dem Deckblatt SingleOrDefault verwendet top (2) in der Abfrage, da geprüft werden muss, ob eine zweite Zeile den Kriterien entspricht, und in diesem Fall eine Ausnahme ausgelöst wird. Grundsätzlich sagen Sie in SingleOrDefault, dass Sie eine Ausnahme auslösen möchten, wenn Ihre Abfrage mehr als 1 Datensatz zurückgibt.

19
zeeshanhirani

Es ist wirklich sehr einfach: Single gibt ein einzelnes Element zurück und löst eine Ausnahme aus, wenn es entweder kein oder mehr als ein Element gibt. First gibt den ersten Gegenstand zurück oder wirft, wenn kein Gegenstand vorhanden ist. FirstOrDefault gibt das erste Element zurück oder den Standardwert (der null ist, falls der angegebene Typ ein Referenztyp ist), wenn kein Element vorhanden ist.

Dies ist das Verhalten, das die API haben soll. Beachten Sie jedoch, dass die zugrunde liegende Implementierung möglicherweise ein anderes Verhalten aufweist. Während Entity Framework dies befolgt, kann ein O/RM wie LLBLGen auch null zurückgeben, wenn First aufgerufen wird, was eine sehr seltsame Sache ist. Dies war eine sehr seltsame (und hartnäckige) Entscheidung des Designers IMO.

15
Steven

Die vier Methoden haben jeweils ihren Platz; Sie haben aber wirklich nur zwei verschiedene Operationen.

  • First - Wenn Sie eine Ergebnismenge erwarten, die mehrere Elemente enthält, geben Sie mir das erste Element in dieser Menge.
  • Single - Wenn Sie ein einzelnes Ergebnis erwarten, geben Sie mir dieses Element.

Die xxxxOrDefault () -Version fügt nur hinzu: "Ich möchte eine leere Ergebnismenge nicht als außergewöhnlichen Umstand betrachten."

8
Chris Shaffer

Auf der anderen Seite können Sie diese Methoden wie folgt durch die Kernlogik teilen:

  • Die Methode fragt die Datenbank direkt ab : Single (), SingleOrDefault (), First (), FirstOrDefault ()
  • Die Methode führt eine Suche im Cache durch, bevor die Abfrage für die Datenbank ausgeführt wird : Find ()

Einige Details zur Leistung, insbesondere im zweiten Fall, finden Sie hier: https://msdn.Microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#

Außerdem können Sie in der ersten Gruppe komplexe Abfragen definieren, aber mit der Methode Find () können Sie nur den Entitätsschlüssel für die Suche bereitstellen.

3
Kryszal

Single () und SingleOrDefault () werden normalerweise für eindeutige Bezeichner wie IDs verwendet, während First () oder FirstOrDefault () wird normalerweise für eine Abfrage verwendet, die mehrere Ergebnisse haben könnte, aber Sie möchten nur das "Top 1".

Single () oder First () würde eine Ausnahme auslösen, wenn kein Ergebnis zurückgegeben wird. SingleOrDefault () und FirstOrDefault () fängt die Ausnahme ab und gibt null oder default (ResultDataType) zurück.

0
MilkTea027