2012-10-06 67 views
1

感謝您的想法Linq to實體TPC和渴望加載子類關係

我使用實體框架5.0,模型第一。

使用每個類(或每個具體類型的表)模式來映射表。

表A 1..Many(摘要)表B

表B有2個類

B1 B2 &

B2有一個外鍵到第3表,假設表C (許多B2 ... 1 C),但這不是父類B的屬性。

Eager loading是應用程序的默認值,我希望在查詢表時包含表(或集合)C B2 - 相當於(僞linq to entiti ES):

from A in _db.A 
.Include(A=>A.B.OfType<B2>()) 
.Include(A=>A.B.OfType<B2>().Include(C)) 
select A 

感謝對我怎麼能強迫該表

回答

2

問題的心臟的渴望負荷的想法是Include(A=>A.B.OfType<B2>())不支持。

據我瞭解ADO.Net團隊似乎他們不想支持部分加載的兒童收藏。 (我傾向於同意他們)。在Linq-to-sql中有DataLoadOptions,但是沒有EF相當於他們。這可以解釋爲什麼IncludeOfType不支持,因爲它會告訴EF部分加載B s的集合。

此外,擴展方法Include僅僅是對象本身的包含方法(如果存在)的包裝。 以ObjectQuery.Include:一個非常簡單的方法,僅包含字符串作爲參數(與DbQuery.Include相同),其中包含要包含的導航屬性的路徑(_db.A.Include("B"))。換句話說:您只能使用可以解析爲MemberExpression的字符串。而B.OfType<>()是一種方法。

解釋爲何不能包含的長篇故事C:導致C的路徑無效。

可以

_db.B.OfType<B2>().Include(b => b.A).Include(b => b.C) 

但是這可能不會給你你後的結果。

+0

謝謝 - 一個經過深思熟慮的答案,並且確定不會節省數小時嘗試解決問題的時間。 TPC繼承被用來在關聯的分類中重用很多通用性,但無法使用include OfType使我認爲我應該實現接口和擴展方法。 – Brent