使用Linq对嵌套值求和

时间:2011-05-05 06:21:52

标签: c# linq lambda

简单问题:我的用户可以拥有许多可以拥有许多产品的订单。 Linq(lambda)查询对于获取用户的所有Product.Price值的总计是什么样的?

我试过这个:

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

但它给了我:

  

转换为值类型'Int32'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。

当然,用户可能没有订单,订单可能没有任何产品。但是Product.Price不是可以为空的值。

所以我尝试了这个,认为它在空集合上窒息:

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

但它正在抛出编译错误,说??的左侧不可为空。

我做错了什么?

提前致谢。

更新:从他的回答中使用Marc的逻辑后,上面的例子的工作版本:

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

1 个答案:

答案 0 :(得分:30)

int total = (from user in users
             from order in user.Orders
             from product in order.Products
             select (int?)product.Price).Sum() ?? 0;

将是我的提议;有一个恼人的小故障,SQL中0到0行的SUM是NULL,而不是0 - 上面的工作就是这个。

或作为lambdas(来自评论):

int total = users.SelectMany(user => user.Orders)
                 .SelectMany(order => order.Products)
                 .Sum(product => (int?)product.Price) ?? 0;