Linq 按子实体上的属性筛选聚合根实体和子实体

Linq 按子实体上的属性筛选聚合根实体和子实体,linq,frameworks,filter,entity,Linq,Frameworks,Filter,Entity,希望有人能帮上忙 我将给出一个基于标准订单-->订单线-->产品而非实际情况的示例,以便于解释 基本上,我想运行一个查询,返回订单行中包含TV的所有订单。很简单: IEnumerable<Order> orders; using (var context = new DataContext()) { var source = context.Orders.Include("Orde

希望有人能帮上忙

我将给出一个基于标准订单-->订单线-->产品而非实际情况的示例,以便于解释

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

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;
IEnumerable订单;
使用(var context=new DataContext())
{
变量源=
context.Orders.Include(“订单行”).Include(
“订单行。产品”);
orders=source.Where(o=>o.OrderLines.Where(ol=>ol.Product.Name==“TV”)).ToList();
}
退货订单;
从某种意义上说,我得到了正确的订单实体集合,但当我使用查看每个订单的订单行集合时,它包含所有订单行,而不仅仅是电视上包含的订单行

希望这是有道理的


提前感谢您的帮助。

我的意思是,查询满足了您的原始条件“要返回所有订单,其中有一个包含TV的订单行”,每个订单当然将包含所有订单行。过滤器仅用于选择订单,而不是订单行

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

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

主要的一点是要知道是否需要在筛选行中保留(或不保留)对订单标题的引用。 也就是说,您是否想要所有电视订单的列表,更准确地说,是他们的电视线路?或者你想让所有的电视线路都不显示他们的订单标题

你似乎更喜欢第一种选择。 那么最好的解决办法当然是

var relevantOrders = orders.Where(order => order.OrderLines.Any(ol => ol.Product.Name == "TV"))
获取相关订单,然后针对相关订单中的每个订单:

order.OrderLines.Where(ol => ol.Product.Name == "TV")
只考虑电视线。


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

谢谢您的回答。有没有办法在一条语句中过滤所有订单的订单行,而不是在订单集合中循环并分别过滤每个订单行?我能想到的接近您所处状态的唯一方法是直接从订单行集合中检索所有带有“TV”的订单行(对于订单行的整个实体集,与订单无关,即
dbContext.OrderLines.Where(ol=>ol.Product.Name==“TV”)
)然后逐步查看每个订单。与SQL查询中的表格数据一样,您将看到许多订单行的相同顺序,如果使用
ReturnedOrderLine.order.OrderLines
,则您将看到该订单的完整订单行集。问题是您正在对查询应用筛选器,而不是结果。选择两个sta最后,ge处理,检索与所有订单行匹配的订单,然后循环遍历每个订单,并将订单行筛选到感兴趣的订单行。这似乎有点效率低下,因为我从数据库中获取的数据超过了我需要的数据,然后在内存中对其进行筛选,但效果很好!感谢您的帮助。可能没有您想象的那么糟糕如果是延迟加载,则使用墨水。