过滤子实体上的属性聚合根实体和子实体

时间:2011-05-17 15:43:51

标签: linq frameworks filter entity

希望有人可以帮助解决这个问题!

我将根据标准订单 - > OrderLine - >产品而不是实际情况给出一个示例,以便更容易解释!

基本上,我想运行一个查询,返回包含电视的订单行的所有订单。很简单:

IEnumerable<Order> orders;
          using (var context = new DataContext())
          {
              var source =
                  context.Orders.Include("OrderLines").Include(
                      "OrderLines.Product");

              orders= source.Where(o => o.OrderLines.Where(ol => ol.Product.Name == "TV")).ToList();
          }
          return orders;

这是因为我得到了正确的Order实体集合,但是当我使用Order Order的OrderLines集合时,它包含所有 OrderLines,而不仅仅是包含在TV中的那些。

希望这是有道理的。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我确实认为查询符合您的原始标准“返回包含电视的订单行的所有订单”,每个订单当然都包含所有订单。过滤器仅用于选择订单,而不是OrderLines。

要从订单中仅检索包含电视的OrderLines,您需要再次使用过滤器,因此:

var OrderLinesWithTV = order.OrderLines.Where(ol => ol.Product.Name == "TV");

答案 1 :(得分:1)

重点是要知道是否需要保留(或不保留)过滤行中订单标题的引用。 即你想要所有订单的列表与电视,更准确地说只有他们的电视线?或者你想要所有的电视线都没关注他们的订单标题?

您似乎更喜欢第一种选择。 那么最好的解决方案当然是

var relevantOrders = orders.Where(order => order.OrderLines.Any(ol => ol.Product.Name == "TV"))

获取相关订单,然后,对于相关订单中的每个订单:

order.OrderLines.Where(ol => ol.Product.Name == "TV")

只考虑电视线。

其他技术会导致信息丢失或迫使您构建类似于初始订单的新订单集合,但在标题和行上进行双重过滤,就优雅和性能而言,这似乎相当糟糕