Ich weiß, dass dies eine alte Frage ist und die akzeptierte Antwort funktioniert, aber diese Frage beantwortete meine Frage, ob eine solche leere Menge zu einer Ausnahme oder einem default(int)
Ergebnis führen würde.
Die akzeptierte Antwort ist jedoch, obwohl sie funktioniert, meiner Meinung nach nicht die ideale Lösung, die hier nicht angegeben wird. Daher gebe ich es in meiner eigenen Antwort zum Nutzen aller, die danach suchen.
Der ursprüngliche Code des OP war:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
So würde ich es schreiben, um Ausnahmen zu vermeiden und ein Standardergebnis bereitzustellen:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
Dies bewirkt den Rückgabetyp des Max
Funktion lautet int?
, wodurch das null
Ergebnis zugelassen und ??
das null
Ergebnis durch ersetzt wird 0
.
BEARBEITEN
Um etwas aus den Kommentaren zu verdeutlichen, unterstützt Entity Framework das as
Schlüsselwort derzeit nicht. Die Vorgehensweise bei der Arbeit mit EF lautet also wie folgt :
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Da [TypeOfWorkers]
dies ein langer Klassenname sein könnte und das Schreiben mühsam ist, habe ich eine Erweiterungsmethode hinzugefügt, um zu helfen.
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
Dies funktioniert nur int
, aber das gleiche könnte getan werden long
, double
oder jeder anderen Werttyp Sie benötigen. Die Verwendung dieser Erweiterungsmethode ist sehr einfach. Sie übergeben einfach Ihre Auswahlfunktion und geben optional einen Wert für null an, der standardmäßig 0 ist. Das oben Gesagte könnte also wie folgt umgeschrieben werden:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Hoffentlich hilft das den Leuten noch mehr.