2011-05-17 86 views
0

希望有人能帮助解决这个问题!通过子实体上的属性过滤聚合根实体和子实体

我给出一个基于标准Order-> OrderLine-> Product的例子,而不是实际的情况来使它更容易解释!

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

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; 

这个作品在这个意义上,我得到令实体的正确收集,但是当我在每一个订单的集合OrderLines的使用看它包含所有 OrderLines不仅仅是那些含电视。

希望是有道理的。

预先感谢任何帮助。

回答

1

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

检索刚刚从你再次使用过滤器订单包含电视OrderLines,即:

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

感谢您的回答。是否有任何方法可以在一个语句中过滤所有订单的OrderLines,而是循环处理订单集合并过滤每个单独的订单行? – Gareth 2011-05-18 08:58:19

+0

我可以考虑接近你所拥有的状态的唯一方法是直接从OrderLines集合中检索所有带有“TV”的OrderLines(对于OrderLines的整个实体集合,与Order没有关系,即'dbContext.OrderLines.Where ol => ol.Product.Name ==“TV”)'),然后逐步升级到每个订单。就像SQL查询中的表格数据一样,您将看到许多OrderLines的相同Order,并且如果使用了'ReturnedOrderLine.Order.OrderLines',那么您将看到该Order的全部OrderLines。问题在于你正在向查询应用过滤器而不是结果。 – Lazarus 2011-05-18 09:52:52

+0

最终为两个阶段的过程进行了检索,检索所有订单项次的匹配订单,然后遍历每个订单,并将订单过滤到感兴趣的订单项。这似乎有点低效,因为我从数据库获取的数据比我需要的还多,然后在内存中对其进行过滤,但它起作用!谢谢您的帮助。 – Gareth 2011-05-20 08:26:46

1

主要的一点是要知道,如果你需要保持(或没有)的一个参考在过滤的行中订购标题。 也就是说你想要所有的订单与电视的清单,更确切地说只有他们的电视线?或者你想要所有的电视线路都不要他们的订单头?

您似乎更喜欢第一个选项。 那么最好的解决方案肯定会

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

来获得相关订单,然后,每个订单在relevantOrders:

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

不仅要考虑电视线。

其他技术会导致信息丢失或迫使您建立一个与初始订单集合类似的新订单集合,但在标题和行上进行双重过滤,这似乎相当糟糕,只要优雅和表现是关心。