簡體   English   中英

實體框架 - 渴望加載子類相關對象

[英]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.Customersnull ,然后設置關系屬性在內存中可以檢測到它不是一個修改,並在調用SaveChanges時引起麻煩。

針對只讀方案進行預測,而不是進行修改。 如果您需要更改跟蹤,可能更安全的方法是在多個往返中加載完整實體,因為無法在單個往返中使用Include在您的情況下加載整個對象圖。

假設您將訂單列表加載為lstOrders,請嘗試以下操作:

foreach (Orders order in lstOrders)
    order.SubOrderBases.Load();

和客戶一樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM