我在Visual Studio 2010中使用实体框架4,使用C#。
我在存储库中使用了一个方法,该方法返回包含各种导航属性的对象集。直到最近,这种方法看起来像这样......
private IEnumerable<VRTSystem> GetSystems() {
return ctx
.Include(s => s.Customer.CustomerType)
.Include(s => s.VRTSystemProductConfigurations);
}
...其中ctx是泛型VRTSystem的ObjectSet。完整的方法有很多.Include()s比这个,但这足以证明这一点。
这很好用,但是我需要添加一些代码来确保只返回Active标志设置为true的VRTSystemProductConfigurations。根据通常针对此类情况提供的建议,我将代码更改为这样......
private IEnumerable<VRTSystem> GetSystems() {
return ctx
.Include(s => s.Customer.CustomerType)
.Include(s => s.VRTSystemProductConfigurations)
.Select(s => new {
System = s,
VRTSystemProductConfigurations = s.VRTSystemProductConfigurations.Where(pc => pc.Active)
})
.Select(s => s.System);
}
但是,这个新版本不包含任何导航属性,它们都是null。
任何人都知道为什么?
答案 0 :(得分:1)
这是因为实体框架并非完全愚蠢。它看到最终只查询System
,因此它会切断两者之间的所有内容并仅返回System
s。你在这里执行的部分技巧是禁用延迟加载,因此导航属性为null并保持为空。
您必须通过添加Select
来删除EF查询提供程序范围之外的最后AsEnumerable
:
return ctx
.Include(s => s.Customer.CustomerType)
.Select(s => new {
System = s,
VRTSystemProductConfigurations = s.VRTSystemProductConfigurations.Where(pc => pc.Active)
})
.AsEnumerable()
.Select(s => s.System);
并且您不想包含VRTSystemProductConfigurations
,因为这是您要部分加载的集合。