在EF 4.1中加载所有导航属性及其子项的最佳方式是什么
本文关键字:是什么 方式 最佳 属性 导航 EF 加载 | 更新日期: 2023-09-27 18:00:42
我正在尝试获取List<EntityType>
,每个项目大约有15个导航属性需要加载,一些导航属性也有一个导航属性也需要加载,这是一个示例代码
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
。
我尝试使用Include
和Load
加载它们,但我认为有一种优雅的方法可以实现
我还试图将LazyLoadingEnabled
设置为false
,但这并不能加载完整的图,我不知道为什么?
所以我需要最好的方法来加载我的EntityType
的完整图形
我使用数据库优先方法EF 4.1
和C# 4.0
下面是我学到的一个技巧:
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查询结果将具有相对较少的重复数据。
关闭延迟加载将阻止它们加载。启用延迟加载并将所有导航属性标记为虚拟,这将允许覆盖它们,以便可以创建动态代理。这将允许延迟加载正常工作。显式加载也是一种选择(许多人认为这是更好的编码实践)。
编辑:哦,对不起,我还以为这是代码优先。然后,如果有帮助的话,由于Include返回一个查询对象,你实际上可以循环遍历它们的列表,并将它们添加到自己中,以动态构建查询。