EF核心自我参照包括所有孩子

时间:2020-01-13 14:14:17

标签: c# entity-framework ef-core-3.0

我有一个这样的实体:

 public string Name { get; set; }
 public string Description { get; set; }
 public Guid? ParentId { get; set; }
 public int Position { get; set; }
 public bool IsVisible { get; set; }

 public virtual Category ParentCategory { get; set; }
 public virtual ICollection<Category> Categories { get; set; }
 public virtual ICollection<Product> Products { get; set; }

在数据库中,我将其插入为:

Category1
 {
  Category2
  {
   Category4
  }  
  Category3
 }

应如何查看实体查询以获取带有ALL子代的所有Category? 我这样训练:

  var category = await _context.Categories
                .Include(x => x.Categories)
                .ThenInclude(x=>x.Categories)
                .OrderBy(x => x.Position).FirstAsync(x => x.ParentId == null);

但是我认为这不是一个好方法,因为我不知道这棵树会很深。

2 个答案:

答案 0 :(得分:0)

您应该尝试此操作(这不是最佳做法)

var categories = await _context.Categories.ToListAsync();

var firstCategory = categories.GroupBy(c=>c.ParentId).FirstOrDefault(c=> c.Key == null).FirstOrDefault();

答案 1 :(得分:0)

加载树的根,意味着获取所有行,并且EF将正确构建树结构。为此,您只需选择全部。

但是我们无法加载子树,要执行的连接数是固定的-因此子树的深度是固定的。

如果深度仅为1或2级,您将自己找到路。只是没有一种方法可以用SQL表示。

这是一个查询,具体取决于返回的数据-不可能。

您想阅读一部分,并且根据结果,您想阅读更多!

它最终出现在多查询解决方案中。 但是,这已经是延迟加载了。在您访问数据时,您的数据将被单独的查询加载。这不是最佳选择,因为这是每个实体一个查询,而不是每个级别一个查询。