Entity Framework - Korrekte Möglichkeit, nach einzelnen Datensätzen zu suchen, bevor sie verwendet werden

7

Um eine Liste von Datensätzen zu erhalten, mache ich normalerweise etwas wie folgt:

%Vor%

Um einen einzelnen Datensatz zu erhalten, benutze ich etwas wie:

%Vor%

Wenn nun mit dem Ansatz für einen einzelnen Datensatz der PK ein fehlerhafter Wert ist (wie es absichtlich im Test ist), gibt die zweite Zeile einen Fehler aus.

Was ist der Best Practice Weg, um einen einzelnen Datensatz zu erhalten und damit umzugehen?

    
Keith Barrows 26.01.2010, 20:59
quelle

4 Antworten

18

Verwenden Sie SingleOrDefault , wenn Sie 0 oder 1 erwarten, oder FirstOrDefault , wenn Sie nur den ersten Datensatz von potenziell vielen benötigen, aber mit 0 umgehen können. Beide geben den Standardwert für den Typ (normalerweise null) if zurück Es gibt keine Ergebnisse.

Übrigens sind solche Abfragen im Allgemeinen besser lesbar (IMO) ohne , wenn Sie einen Abfrageausdruck verwenden. Sie könnten also beispielsweise Folgendes haben:

%Vor%

Abfrageausdrücke eignen sich hervorragend, wenn Sie mehrere Operatoren verwenden oder relativ komplexe Dinge wie Joins ausführen. Wenn Sie jedoch nur haben, erhalten Sie eine where -Klausel oder nur habe eine Projektion, diese "Punktnotation" ist einfacher IMO. Es funktioniert auch besser, wenn Sie am Ende eine Methode wie FirstOrDefault aufrufen müssen.

    
Jon Skeet 26.01.2010, 21:02
quelle
7

Beachten Sie, dass sowohl SingleOrDefault() als auch FirstOrDefault() können Sie den Standardwert nicht angeben.

Es gibt DefaultIfEmpty() , mit denen Sie den Standardwert angeben können, der zurückgegeben werden soll Es gibt keine Elemente in der Aufzählung. Sie können diese mit First() (wie in DefaultIfEmpty().First() ) kombinieren, um FirstOrDefault() -ähnliches Verhalten und ein Lambda zu erhalten, das beim Erstellen einer neuen Instanz und beim Hinzufügen zur Liste verwendet wird.

Wenn Sie nur nach dem Vorhandensein eines Datensatzes suchen müssen, können Sie auch Any() . Dies führt jedoch zu zwei Abfragen, wenn Sie den Datensatz verarbeiten müssen, falls er existiert.

    
Franci Penov 26.01.2010 21:10
quelle
1
%Vor%     
Kisame 02.10.2012 09:09
quelle
0

Sie können auch

verwenden %Vor%

wenn Sie nach einer Aufzeichnung ohne die enthaltenen Modelle suchen.

Oder

%Vor%

Ich empfehle FirstOrDefault über SingleOrDefault wegen der Leistung. Mit SingleOrDefault muss die gesamte Tabelle gescannt werden und sichergestellt werden, dass nur ein Datensatz mit der ID vorhanden ist. Mit FirstOrDefault kann es einfach gehen, bis es ID findet und dann stoppt. Auf einer großen Tabelle sparen Sie mit jeder Abfrage wenig Zeit.

Sie können AsNoTracking auch verwenden, um den Speicherverbrauch zu verbessern, wenn Sie keine Änderungen am Modell verfolgen müssen. Zum Beispiel, wenn Sie es über eine Ruheanforderung ohne Aufruf von Speichern zurückgeben.

    
Jake Steele 01.01.2016 00:14
quelle

Tags und Links