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();
这似乎是不可能的-每当你访问导航属性(BranchGroups
在这种情况下),整个相关集是从数据库中拉出来的,所以你的查询(在哪里,选择,在哪里)的其余部分是在内存中的数据集上执行的,所以它没有翻译成数据库查询。然后,bg.Group
也是导航属性,因此要获得一个,执行单独的数据库查询,正如您所看到的。
所以你的选项是:
- 在构造分支对象时填充组属性(如果你不总是需要加载这些组,则不太好)。
- 通过外部上下文引用(不是从POCO内部)获取组。
也许,在构造Branch对象时,可以这样设置Groups属性:
branch.Groups = context.BranchGroups.Where(c => c.BranchID = branch.ID && ...); // the rest of your query
那么它仍然是POCO(组只是IEnumerable),但包含您需要的查询,这是在访问时惰性加载的(并且没有显式引用上下文)。