2014-02-20 87 views
0

我在C#中使用Visual Studio 2010中的实体框架4。为什么我的包含实体并未包含在内?

我有一个方法用于存储库,该方法返回一个包含各种导航属性的对象集。直到最近,这种方法看起来像这样...

private IEnumerable<VRTSystem> GetSystems() { 
    return ctx 
    .Include(s => s.Customer.CustomerType) 
    .Include(s => s.VRTSystemProductConfigurations); 
} 

...其中ctx是通用类型VRTSystem的ObjectSet。完整的方法有很多。包括()比这,但这足以显示的重点。

这工作得很好,但我需要添加一些代码以确保只有返回了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); 
} 

然而,这个新版本不包括任何导航属性,它们都是空。

任何人都知道为什么?

回答

1

这是因为实体框架并不完全愚蠢。它看到最后只有System s被查询,所以它切断了它们之间的所有内容,仅返回System。你在这里执行的一部分技巧是禁用延迟加载,所以导航属性为空,并保持为空。

你必须通过添加AsEnumerable删除最后Select了EF查询供应商的范围:

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

+0

嗯,不知道我现在做了什么,但是我确信在某些时候我有AsEnumerable()在尝试解决这个问题。这是做这件事的正常方法的一部分。我想知道我是否把它放在错误的地方?无论如何,我添加它,因为你展示,现在它的作品,所以感谢。但是,我不确定为什么您认为我不想包含VRTSystemProductConfigurations。也许我应该指出,我们已经禁用了懒加载,因为这些实体是通过WCF发送的,所以必须急切地包含所有内容。不知道这是否会改变事情。如果没有,请解释你为什么认为我应该包括他们。 –

+0

这是因为您只想加载活动的'VRTSystemProductConfigurations',不是吗?包含不会加载所有这些内容吗? –

+0

是的,但是由于延迟加载关闭,如果我没有使用include,那么它不会加载其中的任何一个。据我所知,这是当你不使用延迟加载时唯一的方法。 –

相关问题