Entity Framework如何使用递归层次结构? Include()似乎无法使用它

c# entity-framework visual-studio-2008

我有一个ItemItem有一个Category

CategoryIDNameParentChildrenParentChildren也属于Category

当我为特定Item执行LINQ to Entities查询时,它不会返回相关的Category ,除非我使用Include("Category")方法。但它并没有带来父母和孩子的完整范畴。我可以做Include("Category.Parent") ,但这个对象就像一棵树,我有一个递归的层次结构,我不知道它的结束位置。

如何让EF完全加载Category ,父母和孩子,父母与父母和孩子,等等?

这不适用于整个应用程序,出于性能考虑,仅需要此特定实体(类别)。

一般承认的答案

您可以使用Load而不是使用Include方法。

然后你可以为每个人做一个并循环所有的孩子,加载他们的孩子。然后通过他们的孩子为每个人做一个,等等。

你所经历的等级数将被硬编码为你拥有的每个循环的数量。

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


热门答案

如果你肯定想要加载整个层次结构,那么如果是我,我会尝试编写一个存储过程,它的工作就是返回层次结构中的所有项目,返回你首先要求的那个(以及随后的子项)。

然后让EF的关系修复确保它们都被连接起来。

即:像:

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

如果您已正确编写存储过程,则实现层次结构中的所有项目(即ToList() )应使EF关系修复启动。

然后你想要的项目(First())应该加载它的所有子项,并且应该加载它们的子项等。所有这些都是从那个存储过程调用填充的,所以也没有MARS问题。

希望这可以帮助

亚历克斯



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因