Я знаю, что это старый вопрос, и принятый ответ работает, но этот вопрос ответил на мой вопрос о том, приведет ли такой пустой набор к исключению или default(int)
результату.
Однако принятый ответ, хотя он и работает, не является идеальным решением ИМХО, которое здесь не приводится. Таким образом, я предоставляю это в своем собственном ответе для выгоды любого, кто ищет это.
Оригинальный код ОП был:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
Вот как я мог бы написать это, чтобы предотвратить исключения и предоставить результат по умолчанию:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
Это приводит к типу возвращаемого значения Max
функции int?
, который разрешает null
результат, а затем ??
заменяет null
результат на 0
.
РЕДАКТИРОВАТЬ
Чтобы пояснить что-то из комментариев, Entity Framework в настоящее время не поддерживает as
ключевое слово, поэтому способ написать его при работе с EF будет следующим:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
Поскольку имя [TypeOfWorkers]
может быть длинным и утомительным для написания, я добавил метод расширения, чтобы выручить.
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
Это только ручки int
, но то же самое можно было бы сделать long
, double
или любой другой тип значения вам нужно. Использовать этот метод расширения очень просто: вы просто передаете свою функцию селектора и, необязательно, включаете значение, которое будет использоваться для нуля, по умолчанию равное 0. Таким образом, вышеприведенное можно переписать так:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Надеюсь, это поможет людям еще больше.