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中的公共表表达式他没有在一个查询中要求它。但根据下面的评论,我猜这就是他想要的。