C# 实体框架核心:为具有可变嵌套级别的对象加载嵌套实体

C# 实体框架核心:为具有可变嵌套级别的对象加载嵌套实体,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,在我的项目中,我有一个名为Question的实体,它有一个名为QuestionCategories的属性,该属性是QuestionCategory类型的对象集合: public class Question : AuditEntity { public long QuestionId { get; set; } public string Text { get; set; } public byte Complexity { get; set; } public

在我的项目中,我有一个名为
Question
的实体,它有一个名为
QuestionCategories
的属性,该属性是
QuestionCategory
类型的对象集合:

public class Question : AuditEntity
{
    public long QuestionId { get; set; }
    public string Text { get; set; }
    public byte Complexity { get; set; }
    public short QuestionTypeId { get; set; }
    public QuestionType QuestionType { get; set; }
    public ICollection<AnswerOption> AnswerOptions { get; set; } = new Collection<AnswerOption>();
    public ICollection<QuestionTag> QuestionTags { get; set; } = new Collection<QuestionTag>();
    public ICollection<QuestionCategory> QuestionCategories { get; set; } = new Collection<QuestionCategory>();
}
每个
Category
都有属性
ParentCategory
,该属性是
Category
类型的对象。这里我有一个分类树,它的分支有不同的长度,由用户定义

目前,如果只有根类别及其子类别,我将以这种方式加载一组问题:

public class QuestionRepository : BaseRepository<Question>, IQuestionRepository
{
    protected override IQueryable<Question> DbQuery => base.DbQuery
        .Include(q => q.QuestionCategories).ThenInclude(qc => qc.Category).ThenInclude(c => c.ParentCategory);
等等

问题是,每个
问题的嵌套级别数量不同,并且数量不受限制。因此,我应该以某种方式计算每个
问题的
类别
级别的数量
,并调用
。然后为每个级别调用include()

然而,我不知道如何实现这一点。非常感谢您的帮助


谢谢

您是否真的尝试访问所有级别,或者您只是假设您必须拥有可变数量的包含才能实现这一点


至少在EF的早期版本中,只需要包含一个自引用层次结构级别。拉入一个自引用关系级别的查询实际上包含连接该关系所有级别所需的所有数据。由于类似于ORM的EF的工作方式,一旦数据可用,就可以构建整个对象图,而不必显式地发出进一步的查询。我不确定它在EF Core中是否仍能以这种方式工作,但我看不出有任何理由不能。这两种方法的基本原理都是一样的。

您是否真的尝试访问所有级别,或者您只是假设您必须拥有可变数量的包含才能实现这一点


至少在EF的早期版本中,只需要包含一个自引用层次结构级别。拉入一个自引用关系级别的查询实际上包含连接该关系所有级别所需的所有数据。由于类似于ORM的EF的工作方式,一旦数据可用,就可以构建整个对象图,而不必显式地发出进一步的查询。我不确定它在EF Core中是否仍能以这种方式工作,但我看不出有任何理由不能。这两种方法的基本原理都是一样的。

Chris,它在EFC中不起作用(在EF中也从未起过作用)。唯一有效的方法是加载整个树(表)。Chris,如果我没有为其他嵌套级别添加ThenInclude()语句,则其父级别的ParentCategory属性的值为null。Chris,它在EFC中不起作用(在EF中也从未起过作用)。唯一有效的方法是加载整个树(表)。Chris,如果我没有为其他嵌套级别添加ThenClude()语句,则其父级别的ParentCategory属性的值为null。
public class QuestionRepository : BaseRepository<Question>, IQuestionRepository
{
    protected override IQueryable<Question> DbQuery => base.DbQuery
        .Include(q => q.QuestionCategories).ThenInclude(qc => qc.Category).ThenInclude(c => c.ParentCategory);
public class QuestionRepository : BaseRepository<Question>, IQuestionRepository
{
    protected override IQueryable<Question> DbQuery => base.DbQuery
        .Include(q => q.QuestionCategories).ThenInclude(qc => qc.Category).ThenInclude(c => c.ParentCategory).ThenInclude(c => c.ParentCategory);