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 Maxfunzione int?, che consente il nullrisultato e quindi ??sostituisce il nullrisultato con 0.
MODIFICA
Solo per chiarire qualcosa dai commenti, Entity Framework al momento non supporta la asparola 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, doubleo 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ù.