Je sais qu'il s'agit d'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 une default(int)
résultat.
La réponse acceptée, bien qu'elle fonctionne, n'est pas la solution idéale à mon avis, et elle n'est pas donnée ici. C'est pourquoi je la fournis dans ma propre réponse pour le bénéfice de tous ceux qui la 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;
Ainsi, le type de retour de la fonction Max
pour être int?
qui permet à l null
et ensuite le ??
remplace le null
résultat avec 0
.
EDITAR
Juste pour clarifier quelque chose dans les commentaires, Entity Framework ne supporte pas actuellement l'option as
La façon de l'écrire en travaillant avec EF serait donc la suivante :
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Depuis le [TypeOfWorkers]
peut être un long nom de classe et 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;
}
Ceci ne traite que int
mais on pourrait faire de même pour long
, double
ou tout autre type de valeur dont 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 prend la valeur 0 par défaut :
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
J'espère que cela aidera encore plus les gens.
0 votes
Naor : avez-vous entendu parler de LINQPad ?
3 votes
Je ne comprends pas pourquoi vous demandez : "Qu'est-ce qui sera dans ?
maxShoeSize
?" si vous l'aviez déjà essayé.0 votes
@jwg : Je suppose que je voulais voir si vous connaissez la réponse :) Finalement, j'ai trouvé une meilleure façon de faire ce que j'ai demandé et c'est ce que je voulais dire.
0 votes
@Naor, ce n'est pas un jeu de devinettes. Je rétrograderais aussi la question originale. Si vous connaissez la réponse, donnez-la nous, sinon vous avez l'air paresseux. J'étais sur le point de poser la même question et j'ai préparé toutes les informations, y compris le message d'exception.