使用Linq求和嵌套值

本文关键字:嵌套 求和 Linq 使用 | 更新日期: 2023-09-27 17:55:03

简单的问题:我的用户可以有很多订单,也可以有很多产品。Linq(lambda(查询是什么样子的,以获得用户对所有Product.Price值的合计?

我试过这个:

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

但它给了我:

转换为值类型"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。

我做错了什么?

提前谢谢。

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

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

使用Linq求和嵌套值

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

将是我的提议;有一个令人讨厌的小故障,即SQL中0行以上的SUM是NULL,而不是0——以上就是解决这个问题的方法。

或作为lambdas(来自评论(:

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