Je sais que c'est une vieille question et que la réponse acceptée fonctionne, mais cette question a répondu à ma question de savoir si un tel ensemble vide entraînerait une exception ou un default(int)résultat.
La réponse acceptée cependant, bien que cela fonctionne, n'est pas la solution idéale à mon humble avis, qui n'est pas donnée ici. Ainsi je le fournis dans ma propre réponse pour le bénéfice de tous ceux qui le recherchent.
Le code original de l'OP était:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
Voici comment je l'écrirais pour éviter les exceptions et fournir un résultat par défaut:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
Cela provoque le type de retour de la Maxfonction int?, ce qui autorise le nullrésultat, puis ??remplace le nullrésultat par 0.
EDIT
Juste pour clarifier quelque chose à partir des commentaires, Entity Framework ne prend actuellement pas en charge le asmot - clé, donc la façon de l'écrire lorsque vous travaillez avec EF serait:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Comme le [TypeOfWorkers]peut être un nom de classe long et qu'il est fastidieux à écrire, j'ai ajouté une méthode d'extension pour vous aider.
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
Cela ne les poignées int, mais la même chose pourrait être fait pour long, doubleou tout autre type de valeur que vous avez besoin. L'utilisation de cette méthode d'extension est très simple, il vous suffit de passer votre fonction de sélection et d'inclure éventuellement une valeur à utiliser pour null, qui vaut par défaut 0. Donc, ce qui précède pourrait être réécrit comme suit:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Espérons que cela aide encore plus les gens.