Я знаю, що це старе запитання, і прийнята відповідь працює, але це запитання відповіло на моє запитання про те, чи призведе такий порожній набір до виключення чи 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.
EDIT
Просто для того, щоб уточнити щось із коментарів, 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або будь-який інший тип значення вам потрібно. Використовуючи цей метод розширення дуже просто, ви просто передаєте свою функцію вибору та необов'язково включаєте значення, яке буде використано для null, яке за замовчуванням дорівнює 0. Отже, вищезгадане можна переписати так:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
Сподіваємось, це допомагає людям ще більше.