用linq选择一个父母和一些孩子

时间:2019-07-13 21:08:14

标签: c# linq

我有三节课: OrderSet-Order(1:n)和OrderDetail(1:n)

OrderSet和Order分别具有一个“状态”属性。

我希望接收一个包含状态为“ open”的所有OrderSet以及状态为“ open”的所有涉及Orders的构造。

我尝试过:

var orderSet = db.OrderSet
      .Where(x => x.Status == 'Open')
      .Where(x => x.Order.Any(y => y.Status == 'Open'))
      .Include(x => x.Order.Select(q => q.OrderDetail))

但是我得到了所有订单,状态也为“已关闭”。

我怎么了?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您要忽略包含任何OrderSet没有“打开”状态的Order,则可以使用:

var orderSets = db.OrderSet
      .Where(os => os.Status == "Open" && os.Order.All(o => o.Status == "Open")
      .Include(os => os.Order.Select(o => o.OrderDetail));

如果您想包括那些OrderSet,而只忽略不满足上述条件的子Order,那么不修改不返回的OrderSet集合就不可能做到这一点。查询。

如果这是您想要做的,实现此目的的一种方法是这样的:

var orderSets = db.OrderSet
      .Where(os => os.Status == "Open")
      .Include(os => os.Order.Select(o => o.OrderDetail)).ToList();
foreach (var orderSet in orderSets)
{
    orderSet.Order.RemoveAll(o => o.Status == "Open");
}