嵌套的数据结果包括使用Linq的null值

本文关键字:Linq null 包括使 数据 结果 嵌套 | 更新日期: 2023-09-27 18:22:22

我确实有一个包含Customer对象的List(集合),Customer类的定义如下,包含Order的名称和集合,inturn订单包含orderdetail的描述和集合,orderdetail有product和quantity。

如何编写LINQ查询以获取客户列表其数量等于客户对象集合中的100?我做了一个查询(见下文),问题是,包含了那些具有null值的orderDetail。有什么建议吗?

**Objects**
Customer { string Name; List<Order> OrderList;}
Order { string Desc; List<OrderDetail> OrderDetailList;}
OrderDetail { string Product; string Quantity; }

**Query**
 customer = ctx.Customer.Include(p=>p.Order)
               .SingleOrDefault(x => x.Order.Any(c=> c.OrderDetail
                                                      .Any(a=>a.Quantity==100))); 

嵌套的数据结果包括使用Linq的null值

您说要获得一个客户列表,但您使用的是SingleOrDefault,它只返回一个客户(如果有的话)。您需要使用Where

至于避免null,您只需在查询(.Where(a => a != null && ...))中添加一个检查即可。

另一个问题是你的问题似乎没有得到很好的定义。每个客户都有一份订单列表,每个订单都有一个"详细信息"列表。因此,当你说你想得到一份数量等于100的客户名单时,并不清楚:你想要所有有订单的客户,其中一种产品的数量是100吗?或者,您希望所有客户的订单数量总和为100?

对于第一个(一个数量等于100),你可以写:

customers = ctx.Customer.Include(p => p.Order).Where(x => 
  x.Order.Any(c => c.OrderDetail != null && c.OrderDetail.Any(
              a => a.Quantity == 100)));

对于第二个(总量等于100),您可以使用Sum并写入:

customers = ctx.Customer.Include(p => p.Order).Where(x =>
  x.Order.Any(c => c.OrderDetail != null && c.OrderDetail.Sum(
              a => a.Quantity) == 100)));

你可能想检查的最后一件事(尽管这不是你问题的一部分)。在您的示例代码中,您使用Include,这意味着您可能在卸载引用时遇到问题,这就是您添加Include的原因(我猜您使用的是实体框架)。因此,您在OrderDetail中遇到的null可能也是卸载引用的结果,而不是真正的null(如果是这种情况,您也应该为OrderDetail添加Include,或者以其他方式加载引用)。