C# EF4中未填充外键对象

C# EF4中未填充外键对象,c#,entity-framework-4,linq-to-entities,C#,Entity Framework 4,Linq To Entities,我认为这是非常基本的东西,但我只是不想让它发挥作用 我尝试使用lambda表达式获取对象列表,如下所示: List<LocalizationGlobalText> list = _entities.LocalizationGlobalTexts.Where(l => l.Language.Id == _currentlanguage).ToList<LocalizationGlobalText>(); List List=\u entities.Localiza

我认为这是非常基本的东西,但我只是不想让它发挥作用

我尝试使用lambda表达式获取对象列表,如下所示:

 List<LocalizationGlobalText> list = _entities.LocalizationGlobalTexts.Where(l => l.Language.Id == _currentlanguage).ToList<LocalizationGlobalText>();
List List=\u entities.LocalizationGlobalTexts.Where(l=>l.Language.Id==\u currentlanguage.ToList();
已获取列表,但外键对象均为空。 我还尝试使用LINQ转换实体,但这会导致相同的问题:

        IEnumerable<LocalizationGlobalText> bla = (from lgt in _entities.LocalizationGlobalTexts
                                                   join lg in _entities.LocalizationGlobals on lgt.IdLocalizationGlobal equals lg.Id
                                                   where lgt.IdLanguage == _currentlanguage
                                                   select lgt);
IEnumerable bla=(来自_entities.LocalizationGlobalTexts中的lgt
在lgt.IdLocalizationGlobal等于lg.Id上加入lg
其中lgt.IdLanguage==\u currentlanguage
选择lgt);

默认情况下,实体框架只引入您指定的集合,没有任何外来对象。如果启用了延迟加载,则访问外部属性将导致它们延迟初始化。如果没有,您需要告诉EntityFramework在第一批中急切地加载您想要的属性

有两种方法可以做到这一点。第一种是“官方”方式,但我不喜欢它,因为它使用了神奇的字符串:

var list = _entities.LocalizationGlobalTexts.Include("ForeignProp")
              .Where(l => l.Language.Id == _currentlanguage)
              .ToList<LocalizationGlobalText>();
由于Entity Framework足够聪明,可以进行适当的连接,因此可以再添加一个选择器,避免在之后使用匿名类型:

var list = _entities.LocalizationGlobalTexts
              .Where(l => l.Language.Id == _currentlanguage)
              .Select(l => new {l, l.ForeignProp})
              .AsEnumerable() // tells EF to load now. The rest is LINQ to Objects
              .Select(i => i.l)
              .ToList();

foreach(var localization in list)
{
    Console.WriteLine(localization.Name + localization.ForeignProp.Title);
}

可能重复请看:第二条路是什么?你只提到一个,很好的概述。第一个选项有效,在我看来是最容易实现的,但我也不喜欢神奇的字符串。当我试图将第二个选项的结果转换为列表时,我得到了一个错误。所以我最终使用了第三个版本,但是像这样。列表=。。。托利斯特();
var list = _entities.LocalizationGlobalTexts
              .Where(l => l.Language.Id == _currentlanguage)
              .Select(l => new {l, l.ForeignProp})
              .AsEnumerable() // tells EF to load now. The rest is LINQ to Objects
              .Select(i => i.l)
              .ToList();

foreach(var localization in list)
{
    Console.WriteLine(localization.Name + localization.ForeignProp.Title);
}