Я знаю, что это старый вопрос, и принятый ответ работает, но этот вопрос ответил на мой вопрос о том, приведет ли такой пустой набор к исключению или результату 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);
Надеемсяэто помогает людям еще больше.