Sé que esta es una pregunta antigua y la respuesta aceptada funciona, pero esta pregunta respondió a mi pregunta sobre si un conjunto tan vacío daría como resultado una excepción o un default(int)
resultado.
Sin embargo, la respuesta aceptada, aunque funciona, no es la solución ideal en mi humilde opinión, que no se da aquí. Por lo tanto, lo estoy proporcionando en mi propia respuesta para el beneficio de cualquiera que lo esté buscando.
El código original del OP fue:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
Así es como lo escribiría para evitar excepciones y proporcionar un resultado predeterminado:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
Esto hace que el tipo de retorno de la Max
función sea int?
, lo que permite el null
resultado y luego ??
reemplaza el null
resultado con 0
.
EDITAR
Solo para aclarar algo de los comentarios, Entity Framework actualmente no admite la as
palabra clave, por lo que la forma de escribirla cuando se trabaja con EF sería:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Dado que [TypeOfWorkers]
podría ser un nombre de clase largo y es tedioso de escribir, he agregado un método de extensión para ayudar.
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
Esto sólo mangos int
, pero el mismo se podría hacer para long
, double
o cualquier otro tipo de valor que necesita. El uso de este método de extensión es muy simple, simplemente pasa su función de selector y opcionalmente incluye un valor que se utilizará para nulo, que por defecto es 0. Por lo tanto, lo anterior podría reescribirse así:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Esperemos que eso ayude a las personas aún más.