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