entity-framework - Entity Framework 预加载过滤器

标签 entity-framework eager-loading

我有一个简单的查询,我想这样做:

1) ProductsChildProducts其中有 PriceTiers2)我想得到所有的ProductsCategoryID 1 和 Display = 真的。
3) 然后我想包括所有 ChildProductsDisplay = 真的。
4) 然后包括 PriceTiersIsActive = 真的。

根据我的阅读,EF 不支持使用过滤器进行 Eager Loading,因此以下操作不起作用:

ProductRepository.Query.IncludeCollection(Function(x) x.ChildProducts.Where(Function(y) y.Display).Select(Function(z) z.PriceTiers.Where(Function(q) q.IsActive))).Where(Function(x) x.Categories.Any(Function(y) y.ID = ID)))

有什么建议?

最佳答案

从下往上开始,意思是在 PriceTier 上应用过滤器对象和它的 parent ,并包括它的 parent (C# 抱歉,但希望你明白这一点):

repository.PriceTiers
  .Include("ChildProduct.Product") // eager load parents
  .Where(priceTier => 
    priceTier.IsActive &&
    priceTier.ChildProduct.Display &&
    priceTier.ChildProduct.Product.ID == 1 &&
    priceTier.ChildProduct.Product.Display)
  .AsEnumerable() // execute SQL statement
  .Select(priceTier => 
    priceTier.ChildProduct.Product) // return products rather than price tiers

(注意:C#中的priceTier =>与VB.NET中的Function(priceTier)相同)
MergeOption理想情况下应该设置为 其他 NoTracking执行查询时。否则,EF 将无法确保在查询结果集中多次出现的对象仅被物化一次,例如 ProductChildProduct :

不需要的结果:
PriceTier 1 和 2 具有相同的父级,但父级已多次具体化 - 每个 PriceTier 一次。
  • 产品一
  • child 产品 1
  • PriceTier 1
  • 产品一
  • child 产品 1
  • PriceTier 2

  • 理想结果:
    套装MergeOption除了 NoTracking得到这些结果:
  • 产品一
  • child 产品 1
  • PriceTier 1
  • PriceTier 2
  • 关于entity-framework - Entity Framework 预加载过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659317/

    相关文章:

    entity-framework - Entity Framework 4 - 将现有模型添加到关联中

    php - 我可以在 Laravel 中急切/延迟加载属性吗?

    java - 如何在单独的线程中进行单例的急切初始化?

    javascript - Parse.com 渴望加载一对多关系 获取父级与子级

    c# - ASP.NET Core 应用程序的 EF Code First 迁移替代方案

    c# - EF 6 延迟加载已禁用,但仍会加载子记录

    c# - Entity Framework 自连接

    c# - 使用 Entity Framework 连接到数据库时出现错误

    c# - 强制预先加载导航属性

    ruby-on-rails - 使用预先加载的 ActiveRecord::Calculations 是否会进行多个数据库查询?