Простая проблема: у меня есть пользователи, которые могут иметь много заказов, которые могут иметь много продуктов. Как выглядит запрос Linq (лямбда), чтобы получить общий итог пользователя по всем значениям Product.Price?
Я пробовал это:
int total = users.Sum(u => u.Orders.Sum(o => o.Products.Sum(p => p.Price)));
Но это дает мне:
Ошибка приведения к типу значения 'Int32', поскольку материализованное значение равно нулю. Либо универсальный параметр типа результата, либо запрос должен использовать обнуляемый тип.
Конечно, пользователь не может иметь никаких заказов, и в заказе не может быть никаких продуктов. Но Product.Price не является недействительным значением.
Итак, я попробовал это, думая, что он задыхается от пустых коллекций:
int total = users.Sum(u => u.Orders.Sum(o => o.Products.Sum(p => p.Price) ?? 0) ?? 0) ?? 0;
Но он выдает ошибки компиляции, говоря, что левая сторона ??
не имеет значения null.
Что я делаю не так?
Заранее спасибо.
ОБНОВЛЕНИЕ: рабочая версия моих примеров выше после использования логики Марка из его ответа:
int total = users.Sum(u => u.Orders.Sum(o => o.Products.Sum(p => (int?)p.Price))) ?? 0;