2013-03-06 45 views
1

實體框架(代碼優先) C#如何用實體樹結構遞歸地枚舉子屬性?

我有一個樹結構,其中包含一對多結構中的節點。

Node 
| 
\--- Children 

我需要列舉所有Children(ICollection)。目前,這是多麼我有看代碼:

using (DBContext context = new DBContext() 
{ 
    parentNode = (from query in context.Tree 
        where query.IsSomeWayToIDTheParentNode 
        select query).ToArray(); 

} 

var tree = SomeRecursiveTreeBuilderMethod(parentNode); 

在這段代碼中,在parentNode第1級兒童屬性枚舉,但實際的子節點兒童性不枚舉,因此拋出異常ContextDisposed 。

我試過在整個查詢(parens之後)和context.Tree之後添加.include(inc => inc.Children),但沒有運氣。我可以很容易地在強制枚舉的using語句中調用遞歸'ChildEnumerator(parentNode)'方法,但是我覺得必須有更好的方法來確保對象和子對象(n-deep)全部完全在轉義上下文範圍的時候填充。

+0

你有沒有嘗試'var tree = SomeRecursiveTreeBuilderMethod(parentNode.ToList());'在第一次調用時強制枚舉? – 2013-03-06 23:14:56

+0

該方法無法強制枚舉,因爲它在上下文的範圍之外,因此,當node.Children在低於父節點的級別上被調用時,它會嘗試枚舉處理的上下文並引發異常。 – jermny 2013-03-06 23:19:12

+0

對不起,沒有注意到......爲什麼不在''using'語句中移動遞歸函數調用呢? – 2013-03-06 23:22:47

回答

0

包括,如果它的正確的格式應該工作,所以是這樣的:

using (DBContext context = new DBContext() 
{ 
    parentNode = context. 
     .Tree 
     .Include(inc => inc.Children) 
     .Where(query => query.IsSomeWayToIDTheParentNode) 
     .ToArray(); 
} 

下面是DbExtensions.Include

+0

這可以用來枚舉兒童的一層,但現在是第二代(或更低)的兒童。 – jermny 2013-08-04 11:11:29

0

官方文檔這應該工作,你希望:

List<Tree> parentNodes = new List<Tree>(); 

using (DBContext context = new DBContext() 
{ 
    parentNodes = (from query in context.Tree 
        where query.IsSomeWayToIDTheParentNode 
        select query).ToList(); 
} 

var tree = SomeRecursiveTreeBuilderMethod(parentNodes); 
+0

這可能不起作用,因爲當您調用SomeRecursiveTreeBuilderMethod(parentNodes)時,上下文已經通過using來處理。而且,當數組完成時,不需要將parentNodes枚舉到列表中。 – jermny 2013-08-04 11:10:31

+0

這正是調用ToList方法時的目標:強制執行查詢評估,如[documentation](http://msdn.microsoft.com/zh-cn/library/bb342261.aspx)中所述。 HTH – 2013-08-05 14:48:03