Проблема, конечно, в том, что после DefaultIfEmpty
параметр x
из Average
вызовов может быть null
(значение по умолчанию CLR для ссылочных типов).
Вернуться к исходной проблеме - Последовательность не содержит элементов исключение при вызове Min
, Max
или Average
в пустой коллекции.Его можно правильно решить двумя способами.
Во-первых, вместо DefaultIfEmpty().Average(selector)
, используйте не очень лаконичную, но рабочую комбинацию Select(selector).DefaultIfEmpty().Average()
, например,
AvgQntPrice10 = s.Where(x => x.Price > 10).Select(x => x.Qnt).DefaultIfEmpty().Average(),
AvgQntPrice100 = s.Where(x => x.Price > 100).Select(x => x.Qnt).DefaultIfEmpty().Average()
Second (ия предпочитаю использовать тот факт, что перегрузочные методы Min
, Max
и Average
, допускающие значение NULL, не генерируют Последовательность не содержит элементов исключение для пустой коллекции, но вместо этого возвращает null
,Поэтому все, что вам нужно, - привести тип выражения селектора к соответствующему типу, допускающему значение NULL, и при необходимости использовать ??
в результате результата метода агрегирования, чтобы назначить специальное значение для этого случая (например, 0
).
Например, если тип Qnt
равен int
(если нет, используйте правильный тип), вышеприведенное можно записать как
AvgQntPrice10 = s.Where(x => x.Price > 10).Average(x => (int?)x.Qnt) ?? 0,
AvgQntPrice100 = s.Where(x => x.Price > 100).Average(x => (int?)x.Qnt) ?? 0