這是隻需要一個解決方案往返:
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
加載您的情況中的整個對象圖。
可能沒有急於加載的解決方案。這是一個解決投影問題的方法(只有接受的答案中的第三個代碼片段有效,而不是第二個片段,請參閱對答案的評論):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
您可以在代碼中簡要描述類和關係嗎('Order','SubOrderBase','MySubOrder','Customer')?看着答案,人們似乎誤解了你的問題。在第一次回答和評論之後,我現在還不確定。 – Slauma
添加圖片類圖 – Gopher