Суммирование вложенных значений с помощью Linq

Простая проблема: у меня есть пользователи, у которых может быть много заказов, у которых может быть много продуктов. Как выглядит запрос Linq (лямбда), чтобы получить общую сумму всех значений Product.Price для пользователя?

Я пробовал это:

int total = users.Sum(u => u.Orders.Sum(o => o.Products.Sum(p => p.Price)));

Но это ' s дает мне:

Приведение к типу значения 'Int32' завершилось неудачно, поскольку материализованное значение равно null. Либо общий параметр типа результата, либо запрос должен использовать тип, допускающий значение NULL.

Конечно, у пользователя может не быть никаких заказов, а в заказе не может быть никаких продуктов. Но Product.Price не допускает значения NULL.

Я попробовал это, думая, что он задыхается от пустых коллекций:

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;
12
задан Jerad Rose 5 May 2011 в 06:35
поделиться