C# 加载自引用表

C# 加载自引用表,c#,entity-framework,hierarchical-data,C#,Entity Framework,Hierarchical Data,我有一个标准的类别自参考表。在我的实体模型中,我建立了关联子项和父项。是否可以在不延迟加载的情况下加载整个类别对象 如果我使用下面的代码,它只加载到第二级 db.Categories.MergeOption = System.Data.Objects.MergeOption.NoTracking; var query = from c in db.Categories.Include("Children") where c.IsVisible == true

我有一个标准的
类别自参考表
。在我的实体模型中,我建立了关联
子项
父项
。是否可以在不延迟加载的情况下加载整个
类别
对象

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

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代码,而且它并没有达到我想要的。

ok,你可以考虑使用Load方法。

 if (!category.Children.IsLoaded)
        category.Children.Load();
当然,类别实体需要由ObjectContext跟踪


这里有更好的解释。

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

如果我有多个实体,我想获取自引用表中的所有子项,我使用的一种实现方法是使用递归cte存储过程使用实体框架获取它们的ID:

我知道这种方法(它将生成成百上千的T-SQL查询),但我也不想在没有跟踪的情况下加载它,因为我正在将它保存到缓存中。我在找别的东西。如果我加载整个类别表,我也加载了父类别和子类别,但不会加载关联属性。此外,我还有CategoryType的相关表,我会为每个类别加载它,不管它们引用的是同一行……好的,我没有看到您必须缓存它。嗯,我会试着思考如何解决这个问题。但如果我运行查询“从类别中选择*”,我已经加载了整个表,也加载了所有父类别和子类别,因为它们都在一个表中。因此,在这种情况下,是否将加载的记录分配给引用的属性并不复杂?如果您实际迭代了整个表,那么所有对象都将在内存中,并且已经被修复,包括或不包括。但是,在你达到表格中的最后一个记录之前,这是不会发生的。Include保证相关对象将出现在您迭代的第一条记录上。“哪个SQL语句在自引用层次结构中包含无限深度?”->T-SQLE中的公共表表达式他没有在一个查询中要求它。但根据下面的评论,我猜这就是他想要的。