在EF 4.1中加载所有导航属性及其子项的最佳方法是什么

时间:2011-06-30 14:01:01

标签: c# .net linq entity-framework-4.1

我想获得一个List<EntityType>,每个项目都有大约15个我需要加载的导航属性,一些导航属性有一个我需要加载的navingation属性,这是一个示例代码

class AA
{
  public EntityReference<B> Bobj
  {
     get;
     set;
  }
  public EntityCollection<C> CCollection
  {
     get;
     set;
  }
}
class B
{
  public EntityCollection<X> XCollection
  {
     get;
     set;
  }
}
class C
{
  public EntityReference<Y> YObj
  {
     get;
     set;
  }
}

List<AA> AList = Dbcontext.AAs.Where(a => a.ID==4).ToList();

我希望List<AA>中的每个项目都加载了BObj及其XCollection和所有CCollection个项目及其YObj。< / p>

我尝试使用IncludeLoad加载它们,但我认为有一种优雅的方式来做到这一点

我还尝试将LazyLoadingEnabled设置为false,但这不会加载我不知道为什么的完整图表?

所以我需要以最佳方式加载EntityType

的完整图表

我正在使用数据库优先方法EF 4.1C# 4.0

2 个答案:

答案 0 :(得分:5)

这是我拾起的一个巧妙的技巧:

List<AA> AList = Dbcontext.AAs.Where(a => a.ID==4)
    .Select(a => new {a, a.Bobj, a.CCollection})
    .ToList().Select(o => o.a).ToList();

Dbcontext.Bs.Where(b => b.A.ID==4)
    .Select(b => new {b, b.XCollection})
    .ToList();
Dbcontext.Cs.Where(c => c.A.ID==4)
    .Select(c => new {c, c.YObj})
    .ToList();

实体框架将弄清楚这些不同对象是如何连接的。您将进行可管理的往返次数(在这种情况下为3次),并且生成的SQL查询结果将具有相对较少的重复数据。

答案 1 :(得分:0)

关闭延迟加载会阻止它们加载。打开延迟加载并将所有导航属性标记为虚拟,这将允许覆盖它们,以便可以创建动态代理。这将允许延迟加载正常工作。显式加载也是一种选择(许多人认为这是更好的编码实践)。

编辑:哦,我认为这也是代码优先,对不起。然后,如果它有帮助,因为Include返回一个查询对象,您实际上可以遍历它们的列表并将它们添加到自己以动态构建您的查询。