C# 嵌套数据结果包括使用Linq的空值

C# 嵌套数据结果包括使用Linq的空值,c#,linq,C#,Linq,我有一个包含Customer对象的列表(集合),Customer类的定义如下,包含订单的名称和集合,inturn Order包含orderdetail的描述和集合,orderdetail包含product和quantity 如何编写LINQ查询以获取客户列表 从客户对象集合中,其数量等于100?我做了一个查询(见下文),问题是,包含了那些具有空值的orderDetail。有什么建议吗 **Objects** Customer { string Name; List<Order> O

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

如何编写LINQ查询以获取客户列表 从客户对象集合中,其数量等于100?我做了一个查询(见下文),问题是,包含了那些具有空值的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))); 
**对象**
客户{string Name;List OrderList;}
订单{string Desc;List OrderDetailList;}
OrderDetail{字符串产品;字符串数量;}
**质疑**
customer=ctx.customer.Include(p=>p.Order)
.SingleOrDefault(x=>x.Order.Any(c=>c.OrderDetail
.任何(a=>a.数量==100));

您说要获取客户列表,但使用的是只返回一个客户(如果有)的
SingleOrDefault
。您需要使用
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中遇到的空值可能也是卸载引用的结果,而不是真正的空值(如果是这种情况,您也应该为OrderDetail添加
Include
,或者以其他方式加载引用)