[英]Entity Framework - Eager loading of subclass related objects
我想知道是否有可能為給定類的某些子類加載相關實體。
課程結構如下
Order與許多基本子類(SuborderBase)有關。 MySubOrder類繼承自SuborderBase。 我想在加載Order時指定Include()加載MySubOrder相關實體(Customer)的路徑,但是我得到一個錯誤,聲稱SuborderBase和Customer之間沒有關系。 但是MySubOrder和Customer之間存在關系。
以下是查詢失敗
Context.Orders.Include("SubOrderBases").Include("SubOrderBases.Customers")
我該如何明確指定?
更新。 實體計划如下
這是一個只需要一次往返的解決方案:
var orders = Context.Orders
.Select(o => new
{
Order = o,
SubOrderBases = o.SubOrderBases.Where(s => !(s is MyOrder)),
MyOrdersWithCustomers = o.SubOrderBases.OfType<MyOrder>()
.Select(m => new
{
MyOrder = m,
Customers = m.Customers
})
})
.ToList() // <- query is executed here, the rest happens in memory
.Select(a =>
{
a.Order.SubOrderBases = new List<SubOrderBase>(
a.SubOrderBases.Concat(
a.MyOrdersWithCustomers.Select(m =>
{
m.MyOrder.Customers = m.Customers;
return m.MyOrder;
})));
return a.Order;
})
.ToList();
它基本上是對匿名類型集合的投影。 然后將查詢結果轉換為內存中的實體和導航屬性。 (它也適用於禁用跟蹤。)
如果您不需要實體,則可以在第一個ToList()
之后省略整個部分,並直接使用匿名對象中的結果。
如果你必須修改這個對象圖並需要更改跟蹤,我不確定這種方法是否安全,因為加載數據時導航屬性沒有完全設置 - 例如,投影后MyOrder.Customers
為null
,然后設置關系屬性在內存中可以檢測到它不是一個修改,並在調用SaveChanges
時引起麻煩。
針對只讀方案進行預測,而不是進行修改。 如果您需要更改跟蹤,可能更安全的方法是在多個往返中加載完整實體,因為無法在單個往返中使用Include
在您的情況下加載整個對象圖。
假設您將訂單列表加載為lstOrders,請嘗試以下操作:
foreach (Orders order in lstOrders)
order.SubOrderBases.Load();
和客戶一樣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.