急切加载自引用表

我有一个标准的自我参考表Categories 。 在我的实体模型中,我创建了ChildrenParent协会。 是否可以在没有延迟加载的情况下加载整个Category对象?

如果我使用下面的代码,它只加载到第二级。

 db.Categories.MergeOption = System.Data.Objects.MergeOption.NoTracking; var query = from c in db.Categories.Include("Children") where c.IsVisible == true orderby c.SortOrder, c.Id select c; 

如果我已经加载了所有类别对象,是否可以加载引用?

加载它的一种方法是多次添加Children属性

 db.Categories.Include("Children.Children.Children.Children.Children") 

但这会产生一个非常长的疯狂的T-SQL代码,而且它也没有做我想要的。

不,这是不可能的。 考虑:所有LINQ to Entities查询都被转换为SQL。 哪个SQL语句在自引用层次结构中包含无限深度? 在标准SQL中,没有一个。 如果在T-SQL中有这样的扩展,我不知道它是什么,我也不认为EF提供商也这样做。

好的,您可以考虑使用Load方法。

  if (!category.Children.IsLoaded) category.Children.Load(); 

当然,需要通过ObjectContext跟踪类别实体。

这里有更好的解释, 如何entity framework – 工作与递归 – 层次结构 – 包括 – 似乎 – 不是 。

我已经习惯实现的一种方法,如果我有几个实体,我想让自引用表中的所有子进程是使用递归cte存储过程来使用entity framework来获取它们的ID: 这是使用entity framework和代码的代码途径