c# - EF Core 获取树层次结构直到最后一个孩子
问题描述
我正在使用带有 SQL Server 的 EF Core 3.1,并且我有一个有问题的应用程序。每个问题可能有一个或多个选项。这可以扩展到无限的级别。例如
What is your Country?
|
|--France
|--United Kingdom
|--United States
|---What is your state?
|---New York
|---Alaska
|---California
|---What is your City?
|--- Los Angeles
|--- San Diego
|--- San Francisco
我希望能够检索整个问题路径。
我的代码如下:
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions options)
: base(options)
{
Database.Migrate();
}
public virtual DbSet<Question> Question { get; set; }
public virtual DbSet<Option> Option { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Question>(entity =>
{
entity.HasMany(x => x.Options)
.WithOne(x => x.ParentQuestion)
.IsRequired();
});
modelBuilder.Entity<Option>(entity =>
{
entity.HasMany(x => x.SubQuestions)
.WithOne(x => x.ParentOption);
});
}
public class Question
{
public Question()
{
Options = new HashSet<Option>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public string QuestionText { get; set; }
// A Question may have one or more than one options
public virtual ICollection<Option> Options { get; set; }
// An Option may have one or more Questions
public long? ParentOptionId { get; set; }
public virtual Option ParentOption { get; set; }
}
public class Option
{
public Option()
{
SubQuestions = new HashSet<Question>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public string OptionText { get; set; }
// A Question may have one or more than one options
public long ParentQuestionid { get; set; }
public virtual Question ParentQuestion { get; set; }
// An Option may have one or more Questions
public virtual ICollection<Question> SubQuestions { get; set; }
}
}
我正在执行:
var questionTree = (from question in context.Question
.Include(x => x.Options)
.ThenInclude(x => x.SubQuestions)
select question).FirstOrDefault();
但它只返回第一级。我怎样才能让整棵树升到最低层?
一旦这个数据库堆积了数十万个问题,它会影响性能吗?
解决方案
推荐阅读
- javascript - 如何编写简单的 Jest 预设
- pushover - Pushover Base64 图像附件
- c# - FluentFtp 异步方法不起作用
- java - 如何在 JSON 有效负载的单个字段中处理不同类型的值
- c# - 无法在我的机器上运行特定的 ASP.NET 项目。Rider 和 VS2019
- laravel - 内爆函数返回内爆():传递的参数无效
- python - AttributeError: 'NoneType' 对象没有使用 googletrans 和 pyjokes 的属性 'group'
- python-3.x - Python - SSH到远程主机并打开一个文件并处理该特定文件
- c++ - 将时间戳字符串转换为格式“%d-%m-%Y”
- rust - 如何超出字符串切片的起始索引?