繁体   English   中英

EF6渴望在POCO内部加载

[英]EF6 eager loading inside POCO

可以说,我有这样的结构:

  • 分行: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();

这似乎是不可能的-每当您访问导航属性(在这种情况下为BranchGroups )时,都会从数据库中提取整个相关集,因此其余查询(Where,Select,Where)是对内存中的数据集执行的,因此没有翻译成数据库查询。 然后, 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),但包含您需要的查询,该查询在访问时是延迟加载的(并且没有对上下文的显式引用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM