Entity Framework如何处理递归层次结构?Include()似乎无法处理它。
Entity Framework如何处理递归层次结构?Include()似乎无法处理它。
我有一个Item
。 Item
有一个Category
。
Category
具有ID
、Name
、Parent
和Children
。 Parent
和Children
也是Category
。
当我对特定的Item
执行LINQ to Entities查询时,它不会返回相关的Category
,除非我使用Include(\"Category\")
方法。但是它没有将完整的类别带来,包括其父级和子级。 我可以进行Include(\"Category.Parent\")
,但这个对象就像一棵树,我有一个递归层次结构,我不知道它在哪里结束。
我如何使EF完全加载Category
,带有父级和子级,父级与其父级和子级,依此类推?
这不是整个应用程序的事情,为了性能考虑,只需要针对此特定实体,即Category
。
如果你一定要加载整个层次结构,那么如果我是你,我会尝试编写一个存储过程,其工作是返回层次结构中的所有项,首先返回你所要求的项(随后返回其子项)。然后让 EF 的关系修复确保它们都被连接起来。例如:
// the GetCategoryAndHierarchyById method is an enum Category c = ctx.GetCategoryAndHierarchyById(1).ToList().First();
如果你正确编写了存储过程,将层次结构中的所有项实例化(即使用 ToList()
),EF 的关系修复就应该启动。然后你要求的项(使用 First())应该已经加载了其所有子项,它们的子项等等。所有这些都可以从一个存储过程调用中获得,因此也没有 MARS 问题。
希望这能帮到你。
Alex
与使用Include
方法不同,您可以使用Load
方法。
然后,您可以使用循环for each
遍历所有子项,加载其子项。然后通过他们的子项,进行循环for each
,以此类推。
您将进入的层数将被硬编码在for each
循环的数量中。
以下是使用Load
的示例:http://msdn.microsoft.com/en-us/library/bb896249.aspx