在延迟上将Linq过滤到实体加载3级嵌套查询

时间:2011-11-10 20:04:44

标签: entity-framework-4 linq-to-entities

假设一个实体框架,在LazyLoading上下文中。

我们有3个实体:

  • 产品(有很多订单明细)
  • OrderDetails(有很多细节)
  • 详细

以下查询为所有产品带来Name = Books。并且每个产品都会加载所有 OrderDetails ,其中OrderDetail.Quantity> 5.

var query = anEntityManager.Products.Where(p => p.Name == "Books")
.Select(p => new { Product = p, OrderDetails = p.OrderDetails.Where(od => od.Quantity >       5) });
var results = query.ToList();
var products = results.Select( x => x.Product);

我的问题是,未从数据库中检索每个 OrderDetail 详细信息。如何在此查询中添加“包括”以便在同一查询中从数据库加载详细信息

1 个答案:

答案 0 :(得分:1)

我认为你需要扩展你的预测:

var query = anEntityManager.Products.Where(p => p.Name == "Books")
    .Select(p => new
    {
        Product = p,
        OrderDetails = p.OrderDetails.Where(od => od.Quantity > 5),
        Details = p.OrderDetails.Where(od => od.Quantity > 5)
                                .SelectMany(od => od.Details)
    });
var results = query.ToList();
var products = results.Select( x => x.Product);

不支持在投影中使用Include,因此这个(有点难看)代码是我知道在一个数据库查询中获得结果的唯一方法。

你也可以使用Select代替SelectManyDetails然后是IEnumerable<IEnumerable<Detail>>而不是IEnumerable<Detail>},因为你正在扔掉无论如何都是预计的属性 - 除了Product属性。