Tatsächlich gibt es einen recht eleganten (und leistungsfähigeren im Vergleich zu dem in der anderen Antwort vorgeschlagenen Weg, da nur eine einzige Datenbankabfrage ausgeführt wird), indem die Tatsache genutzt wird, dass Methoden wie Min
aggregiert werden , Max
Wirf Sequence contains no element
Ausnahme nur bei Verwendung mit Nicht-Nullable-Überladungen, aber Nullable-Überladungen geben einfach null
zurück stattdessen.
Sie müssen also nur den Nicht-Nullable-Eigenschaftstyp in den entsprechenden Nullable-Typ hochstufen. Wenn beispielsweise OrderIndex
Typ ist int
, die einzige Änderung an Ihrer Abfrage könnte sein
.MaxAsync(x => (int?)x.OrderIndex);
Beachten Sie, dass dies auch den Typ der empfangenden Variable highestOrderIndex
ändert bis int?
. Sie können nach null
suchen und entsprechend reagieren, oder Sie kombinieren einfach den Aggregatfunktionsaufruf mit ??
Operator und geben Sie einen Standardwert an, zum Beispiel
var highestOrderIndex = (await _context.ExampleDbSet
.Where(x => x.ForeignId == foreignId)
.MaxAsync(x => (int?)x.OrderIndex)) ?? -1; // or whatever "magic" number works for you
Einen AnyAsync
ausführen und dann ein MaxAsync
führt zu zwei separaten Datenbankaufrufen. Sie können es zu einem verdichten, indem Sie sicherstellen, dass die Sequenz einen "Standard" -Mindestwert enthält. Dies ist überall dort ein nützlicher Trick, wo Sie die Linq Max/Min-Methoden verwenden, nicht nur im Datenbankcode:
context.ExampleDbSet
.Where(w => w.ForeignId == foreignId)
.Select(s => s.OrderIndex)
.Concat(new[] { 0 })
.MaxAsync();
Sie können herausfinden, ob Aufzeichnungen vorhanden sind, und wenn ja, dann finden Sie die max. Etwa so:
var query = _context.ExampleDbSet
.Where(x => x.ForeignId == foreignId);
var itemsExist = await query.AnyAsync();
int maxOrderIndex = 0;
if(itemsExist)
{
maxOrderIndex = await query.MaxAsync(x => x.OrderIndex);
}
Hier müssen Sie nicht alle Elemente aus der Datenbank abrufen, sondern nur prüfen, ob ein Datensatz vorhanden ist, was viel schneller geht, und Sie können die Methode auch asynchron halten.