2013-03-06 41 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