Ef-Kern:Sequenz enthält kein Element, wenn MaxAsync ausgeführt wird

Ef-Kern:Sequenz enthält kein Element, wenn MaxAsync ausgeführt wird

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.