Entity Framework如何处理递归层次结构?Include()似乎无法处理它。

10 浏览
0 Comments

Entity Framework如何处理递归层次结构?Include()似乎无法处理它。

我有一个ItemItem有一个Category

Category具有IDNameParentChildrenParentChildren也是Category

当我对特定的Item执行LINQ to Entities查询时,它不会返回相关的Category,除非我使用Include(\"Category\")方法。但是它没有将完整的类别带来,包括其父级和子级。 我可以进行Include(\"Category.Parent\"),但这个对象就像一棵树,我有一个递归层次结构,我不知道它在哪里结束。

我如何使EF完全加载Category,带有父级和子级,父级与其父级和子级,依此类推?

这不是整个应用程序的事情,为了性能考虑,只需要针对此特定实体,即Category

admin 更改状态以发布 2023年5月20日
0
0 Comments

如果你一定要加载整个层次结构,那么如果我是你,我会尝试编写一个存储过程,其工作是返回层次结构中的所有项,首先返回你所要求的项(随后返回其子项)。然后让 EF 的关系修复确保它们都被连接起来。例如:

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

如果你正确编写了存储过程,将层次结构中的所有项实例化(即使用 ToList()),EF 的关系修复就应该启动。然后你要求的项(使用 First())应该已经加载了其所有子项,它们的子项等等。所有这些都可以从一个存储过程调用中获得,因此也没有 MARS 问题。

希望这能帮到你。

Alex

0
0 Comments

与使用Include方法不同,您可以使用Load方法。

然后,您可以使用循环for each遍历所有子项,加载其子项。然后通过他们的子项,进行循环for each,以此类推。

您将进入的层数将被硬编码在for each循环的数量中。

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

0