如何使用实体树结构递归枚举子属性?

时间:2013-03-06 23:11:22

标签: c# linq entity-framework

实体框架(代码优先) C#

我有一个树结构,节点是一对多结构。

Node
|
\--- Children

我需要枚举所有孩子(ICollection)。目前,这就是我看到代码的方式:

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

}

var tree = SomeRecursiveTreeBuilderMethod(parentNode);

在此代码中,枚举parentNode上的第一级Children属性,但不枚举实际子节点的Children属性,因此抛出ContextDisposed异常。

我尝试将.Include(inc => inc.Children)添加到整个查询(在parens之后)和context.Tree之后但没有运气。我可以很容易地在using语句中调用一个递归的'ChildEnumerator(parentNode)'方法来强制枚举,但我觉得必须有一种更好的方法来确保对象和子对象(n-deep)都是完全的在逃避上下文范围时填充。

2 个答案:

答案 0 :(得分:0)

如果格式正确,Include应该可以正常工作,如下所示:

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

以下是DbExtensions.Include

的官方文档

答案 1 :(得分: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);