2011-10-03 87 views
10

我不知道是否有可能爲給定類的某個子類急切加載相關實體。實體框架 - 急切加載子類相關對象

類結構低於

訂單具有相對於許多基亞目類(SuborderBase)。 MySubOrder類繼承自SuborderBase。我想指定Include()加載Order時加載MySubOrder相關實體(Customer)的路徑,但我得到一個錯誤,聲明SuborderBase和Customer之間沒有關係。但是MySubOrder和Customer之間存在關係。

下面是查詢失敗

Context.Orders.Include("SubOrderBases").Include("SubOrderBases.Customers") 

我怎麼可以指定明確?

更新。實體方案如下 enter image description here

+1

可能沒有急於加載的解決方案。這是一個解決投影問題的方法(只有接受的答案中的第三個代碼片段有效,而不是第二個片段,請參閱對答案的評論):http://stackoverflow.com/questions/6586574/bottleneck-using-entity-framework-遺產。這裏(http://stackoverflow.com/questions/7203303/how-do-i-deeply-eager-load-an-entity-with-a-reference-to-an-instance-of-a-persist)是一個類似的問題根本沒有答案。 – Slauma

+0

您可以在代碼中簡要描述類和關係嗎('Order','SubOrderBase','MySubOrder','Customer')?看着答案,人們似乎誤解了你的問題。在第一次回答和評論之後,我現在還不確定。 – Slauma

+0

添加圖片類圖 – Gopher

回答

13

這是隻需要一個解決方案往返:

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加載您的情況中的整個對象圖。

+0

謝謝!很有趣的解決方案不完全是我想要的,但我認爲這個例子將是一個偉大的靈感 – Gopher

+9

很好的答案,但是一個非常愚蠢的做事方式。任何人都會認爲EF團隊忽略了關係數據庫之間存在關係的事實。 –

0

假設ü加載命令列表作爲lstOrders,試試這個:

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

與同爲顧客..

+2

是的,但我想如何做到這一點與1 sql查詢.. – Gopher

+2

試試這個:Context.Orders.Include(「SubOrderBases」).include(「Customers」) – Boomer

相關問題