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 Max
fonction int?
, ce qui autorise le null
résultat, puis ??
remplace le null
résultat par 0
.
EDIT
Juste pour clarifier quelque chose à partir des commentaires, Entity Framework ne prend actuellement pas en charge le as
mot - 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
, double
ou 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.