[英]What is the best way to load all navigation properties and their children in EF 4.1
我正在嘗試獲取一個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();
Entity Framework 將弄清楚這些不同的對象是如何連接的。 您將進行可管理的往返次數(在本例中為 3 次),並且生成的 SQL 查詢結果將具有相對較少的重復數據。
關閉延遲加載會阻止它們加載。 打開延遲加載並將所有導航屬性標記為虛擬,這將允許它們被覆蓋,以便可以創建動態代理。 這將允許延遲加載正常工作。 顯式加載也是一種選擇(許多人認為這是更好的編碼實踐)。
編輯:哦,我還以為是代碼優先,對不起。 然后,如果它有幫助,由於 Include 返回查詢 object,您實際上可以遍歷它們的列表並將它們添加到自身以動態構建查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.