Ich habe eine teuflische Zeit damit, einen Vergleich der verschiedenen Möglichkeiten zu finden, nach einem einzelnen Element zu fragen und wann jedes verwendet werden soll.
Hat jemand einen Link, der all dies vergleicht, oder eine kurze Erklärung, warum Sie einen über den anderen verwenden würden? Gibt es noch mehr Betreiber, die mir nicht bekannt sind?
Danke dir.
Sales.OrderByDescending(s => s.TotalValue).First();
Single
oderSingleOrDefault
für 2 Datensätze (Limit 2) , während abfragenFirst
oderFirstOrDefault
wird abfrage 1 (Limit 1).Ich neige immer dazu, zu benutzen
FirstOrDefault
. Wenn Sie wirklich wählerisch mit der Leistung sein möchten, sollten SieFirstOrDefault
in EF verwenden. Unter dem DeckmantelSingleOrDefault
wird top (2) in der Abfrage verwendet, da geprüft werden muss, ob eine zweite Zeile vorhanden ist, die den Kriterien entspricht, und in diesem Fall eine Ausnahme ausgelöst wird. GrundsätzlichSingleOrDefault
sagen Sie, dass Sie eine Ausnahme auslösen möchten, wenn Ihre Abfrage mehr als 1 Datensatz zurückgibt.quelle
FirstOrDefault
und gemessenSingleOrDefault
, um signifikant zu sein? Ich würde sagen, es ist in den meisten Fällen eine vorzeitige Optimierung.Single()
oderSingleOrDefault()
wenn ich etwas zurückgebe, von dem es nur eines geben sollte . Der Grund, warum ich dies tue, besteht darin, Fehler zu erkennen, indem schlecht geschriebene Abfragen, die mehr zurückgeben als sie sollten, fehlschlagen. Zumindest in meinen Augen wird dies dazu beitragen, die Daten im System konsistent zu halten. Natürlich ist das langsamer, aber ich würde vermuten, dass es nicht viel langsamer ist, und ich bin bereit, diesen Preis zu zahlen.Es ist wirklich sehr einfach:
Single
Gibt einen einzelnen Artikel zurück und löst eine Ausnahme aus, wenn entweder keiner oder mehr als ein Artikel vorhanden ist.First
gibt den ersten Gegenstand zurück oder wirft, wenn kein Gegenstand vorhanden ist.FirstOrDefault
Gibt das erste Element zurück oder gibt den Standardwert zurück (null
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 ein anderes Verhalten aufweisen kann. Während Entity Framework dies befolgt, kann ein O / RM wie LLBLGen auch
null
beim Aufrufen zurückkehren ,First
was eine sehr seltsame Sache ist. Dies war eine sehr seltsame (und hartnäckige) Entscheidung des Designers IMO.quelle
Single
drückt deutlich aus, dass Sie nur ein Element erwarten.Die vier Methoden haben jeweils ihren Platz; Obwohl Sie wirklich nur zwei verschiedene Operationen haben.
Die xxxxOrDefault () -Version fügt nur hinzu: "Ich möchte eine leere Ergebnismenge nicht als außergewöhnlichen Umstand betrachten."
quelle
Auf der anderen Seite können Sie diese Methoden wie folgt durch die Kernlogik teilen:
Für einige Leistungsdetails, vor allem im zweiten Fall können Sie hier sehen: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
Darüber hinaus können Sie in der ersten Gruppe komplexe Abfragen definieren. Mit der Find () -Methode können Sie jedoch nur den Entitätsschlüssel für die Suche bereitstellen.
quelle
Single () und SingleOrDefault () werden normalerweise für eindeutige Bezeichner wie IDs verwendet, während First () oder FirstOrDefault () normalerweise für eine Abfrage verwendet werden, die mehrere Ergebnisse haben kann, aber nur die "Top 1" möchten .
Single () oder First () würden eine Ausnahme auslösen, wenn kein Ergebnis zurückgegeben wird. SingleOrDefault () und FirstOrDefault () fangen die Ausnahme ab und geben null oder default (ResultDataType) zurück.
quelle