EF6 eager loading inside POCO

本文关键字:POCO inside loading eager EF6 | 更新日期: 2023-09-27 18:17:12

比如说,我有这样一个结构:

  • 分支:Id
  • 组:Id
  • BranchGroup: BranchId, GroupId, Since, Till

关系为Branch 1..N BranchGroup 1..1 Group,因此生成的Branch类具有ICollection<BranchGroup> BranchGroups导航属性。

Branch POCO内部有一个属性,返回电流组(简化了一点):

public List<Group> Groups => BranchGroups.Where(bg => bg.Since <= DateHelper.Current && 
                                                      bg.Till >= DateHelper.Current)
                                          .Select(bg => bg.Group).ToList();

我调用它,db被成千上万的查询所爆炸,每个查询用于一个组。是否有可能在没有访问dbContext的情况下以某种方式优化它(或至少从内部实体到达当前上下文)?

UPD:最简单的实际查询是这样的:

public List<Group> Groups => BranchGroups.Where(bg => bg.Since <= DateHelper.Current && 
                                                      bg.Till >= DateHelper.Current)
                                          .Select(bg => bg.Group)
                                          .Where(g => !g.Deleted).ToList();

EF6 eager loading inside POCO

这似乎是不可能的-每当你访问导航属性(BranchGroups在这种情况下),整个相关集是从数据库中拉出来的,所以你的查询(在哪里,选择,在哪里)的其余部分是在内存中的数据集上执行的,所以它没有翻译成数据库查询。然后,bg.Group也是导航属性,因此要获得一个,执行单独的数据库查询,正如您所看到的。

真正的POCO对象不应该与DbContext有任何关系,它们只是普通的对象。因此,您不能(也不应该能够)从POCO内部访问上下文(或者它不再是POCO)。

所以你的选项是:

  1. 在构造分支对象时填充组属性(如果你不总是需要加载这些组,则不太好)。
  2. 通过外部上下文引用(不是从POCO内部)获取组。
  3. 也许,在构造Branch对象时,可以这样设置Groups属性:

      branch.Groups = context.BranchGroups.Where(c => c.BranchID = branch.ID && ...); // the rest of your query
    

    那么它仍然是POCO(组只是IEnumerable),但包含您需要的查询,这是在访问时惰性加载的(并且没有显式引用上下文)。