我有一个这样的实体:
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);
但是我认为这不是一个好方法,因为我不知道这棵树会很深。
答案 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表示。
这是一个查询,具体取决于返回的数据-不可能。
您想阅读一部分,并且根据结果,您想阅读更多!
它最终出现在多查询解决方案中。 但是,这已经是延迟加载了。在您访问数据时,您的数据将被单独的查询加载。这不是最佳选择,因为这是每个实体一个查询,而不是每个级别一个查询。