So che questa è una vecchia domanda e la risposta accettata funziona, ma questa domanda ha risposto alla mia domanda se un set così vuoto avrebbe comportato un'eccezione o un default(int)
risultato.
La risposta accettata, tuttavia, mentre funziona, non è la soluzione ideale IMHO, che non viene fornita qui. Quindi lo sto fornendo nella mia risposta a beneficio di chiunque lo stia cercando.
Il codice originale del PO era:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
Ecco come lo scriverei per evitare eccezioni e fornire un risultato predefinito:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
Ciò causa il tipo restituito della Max
funzione int?
, che consente il null
risultato e quindi ??
sostituisce il null
risultato con 0
.
MODIFICA
Solo per chiarire qualcosa dai commenti, Entity Framework al momento non supporta la as
parola chiave, quindi il modo di scriverla quando si lavora con EF sarebbe:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Dato che [TypeOfWorkers]
potrebbe essere un nome di classe lungo ed è noioso da scrivere, ho aggiunto un metodo di estensione per dare una mano.
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
Questo solo maniglie int
, ma lo stesso potrebbe essere fatto per long
, double
o qualsiasi altro tipo di valore è necessario. L'uso di questo metodo di estensione è molto semplice, basta passare la funzione di selezione e facoltativamente includere un valore da utilizzare per null, che per impostazione predefinita è 0. Quindi quanto sopra può essere riscritto in questo modo:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Spero che questo aiuti le persone ancora di più.