[英]EF6 eager loading inside POCO
可以说,我有这样的结构:
关系是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)。
因此,您的选择是:
也许在构造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.