Entity Framework如何使用遞歸層次結構? Include()似乎無法使用它

c# entity-framework visual-studio-2008

我有一個ItemItem有一個Category

CategoryIDNameParentChildrenParentChildren也屬於Category

當我為特定Item執行LINQ to Entities查詢時,它不會返回相關的Category ,除非我使用Include("Category")方法。但它並沒有帶來父母和孩子的完整範疇。我可以做Include("Category.Parent") ,但這個對象就像一棵樹,我有一個遞歸的層次結構,我不知道它的結束位置。

如何讓EF完全加載Category ,父母和孩子,父母與父母和孩子,等等?

這不適用於整個應用程序,出於性能考慮,僅需要此特定實體(類別)。

一般承認的答案

您可以使用Load而不是使用Include方法。

然後你可以為每個人做一個並循環所有的孩子,加載他們的孩子。然後通過他們的孩子為每個人做一個,等等。

你所經歷的等級數將被硬編碼為你擁有的每個循環的數量。

以下是使用Load的示例: http//msdn.microsoft.com/en-us/library/bb896249.aspx


熱門答案

如果你肯定想要加載整個層次結構,那麼如果是我,我會嘗試編寫一個存儲過程,它的工作就是返回層次結構中的所有項目,返回你首先要求的那個(以及隨後的子項)。

然後讓EF的關係修復確保它們都被連接起來。

即:像:

// the GetCategoryAndHierarchyById method is an enum
Category c = ctx.GetCategoryAndHierarchyById(1).ToList().First();

如果您已正確編寫存儲過程,則實現層次結構中的所有項目(即ToList() )應使EF關係修復啟動。

然後你想要的項目(First())應該加載它的所有子項,並且應該加載它們的子項等。所有這些都是從那個存儲過程調用填充的,所以也沒有MARS問題。

希望這可以幫助

亞歷克斯



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因