嵌套数据结果包含使用Linq的空值

时间:2015-11-18 02:33:45

标签: c# linq

我有一个包含Customer对象的List(集合),客户类定义如下,包含名称和Order集合,包含描述和orderdetail集合的inturn订单,orderdetail具有产品和数量。

如何编写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))); 

1 个答案:

答案 0 :(得分:0)

您说要获取客户列表,但使用的SingleOrDefault仅返回单个客户(如果有)。您需要使用Where

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

另一个问题是您的问题似乎没有明确定义。 每个客户都有一个订单列表,每个订单都有一个“详细信息”列表。因此,当您说要获得数量等于100的客户列表时,不清楚:您是否希望所有订购了哪一个产品的客户的数量为100?或者您可能希望订购数量总和为100的所有客户<?p>

对于第一个(一个数量等于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,或者加载引用其他一些方式)。

相关问题