Eu sei que essa é uma pergunta antiga e a resposta aceita funciona, mas essa pergunta respondeu à minha pergunta sobre se um conjunto vazio resultaria em uma exceção ou em um default(int)
resultado.
A resposta aceita, no entanto, enquanto funciona, não é a solução ideal IMHO, que não é fornecida aqui. Portanto, estou fornecendo isso em minha própria resposta para o benefício de quem estiver procurando por ele.
O código original do OP era:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
É assim que eu escreveria para evitar exceções e fornecer um resultado padrão:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
Isso faz com que seja o tipo de retorno da Max
função int?
, que permite o null
resultado e, em seguida, ??
substitui o null
resultado por 0
.
EDIT
Apenas para esclarecer algo dos comentários, o Entity Framework atualmente não suporta a as
palavra - chave; portanto, a maneira de escrevê-la ao trabalhar com a EF seria:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Como [TypeOfWorkers]
poderia ser um nome de classe longo e é entediante de escrever, adicionei um método de extensão para ajudar.
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
Isso só alças int
, mas o mesmo poderia ser feito para long
, double
ou qualquer outro tipo de valor que você precisa. O uso desse método de extensão é muito simples, basta passar na função seletora e, opcionalmente, incluir um valor a ser usado para null, cujo padrão é 0. Portanto, o acima pode ser reescrito da seguinte maneira:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Espero que ajude as pessoas ainda mais.