为什么我的实体不包括在内?

时间:2014-02-20 23:33:59

标签: c# entity-framework entity-framework-4

我在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。

任何人都知道为什么?

1 个答案:

答案 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,因为这是您要部分加载的集合。