Um den Maximalwert einer Spalte zu erhalten, die eine Ganzzahl enthält, kann ich den folgenden T-SQL-Befehl verwenden
SELECT MAX(expression )
FROM tables
WHERE predicates;
Ist es möglich, mit Entity Framework das gleiche Ergebnis zu erzielen?
Angenommen, ich habe das folgende Modell
public class Person
{
public int PersonID { get; set; }
public int Name { get; set; }
public int Age { get; set; }
}
Wie erhalte ich das Alter der ältesten Person?
int maxAge = context.Persons.?
c#
sql
entity-framework
max
Richard77
quelle
quelle
Wenn die Liste leer ist, bekomme ich eine Ausnahme. Diese Lösung berücksichtigt dieses Problem:
quelle
await _context.Persons.MaxAsync(x => (int?)x.Age) ?? 0
Oder Sie können dies versuchen:
quelle
Vielleicht helfen Sie, wenn Sie einen Filter hinzufügen möchten:
quelle
oder so ähnlich.
quelle
Ihre Spalte ist nullbar
Ihre Spalte ist nicht nullwertfähig
In beiden Fällen können Sie den zweiten Code verwenden. Wenn Sie verwenden
DefaultIfEmpty
, führen Sie eine größere Abfrage auf Ihrem Server durch. Für Interessierte gibt es hier das EF6-Äquivalent:Abfrage ohne
DefaultIfEmpty
Abfrage mit
DefaultIfEmpty
quelle
int maxAge = context.Persons.Max(x => (int?)x.Age) ?? 0;
In VB.Net wäre es
quelle
Wie viele sagten - diese Version
löst eine Ausnahme aus, wenn die Tabelle leer ist.
Verwenden
oder
quelle
Diese Version, wenn die Liste leer ist :
null
- für nullbare ÜberladungenSequence contains no element
Ausnahme aus - für nicht nullbare Überladungen- -
Diese Version behandelt den Fall einer leeren Liste, generiert jedoch komplexere Abfragen und funktioniert aus irgendeinem Grund nicht mit EF Core.
- -
Diese Version ist elegant und performant (einfache Abfrage und einmaliger Roundtrip zur Datenbank) und funktioniert mit EF Core. Die oben erwähnte Ausnahme wird behandelt, indem der nicht nullbare Typ in nullable umgewandelt und dann der Standardwert mithilfe des
??
Operators angewendet wird .quelle
Die ausgewählte Antwort löst Ausnahmen aus, und die Antwort von Carlos Toledo wendet die Filterung an, nachdem alle Werte aus der Datenbank abgerufen wurden.
Der folgende führt einen einzelnen Roundtrip aus und liest ausnahmslos einen einzelnen Wert unter Verwendung möglicher Indizes.
quelle