Загрузка саморегулирующегося объекта с помощью EF Core 5.0 (просто укажите родителей и их детей в их свойстве навигации)

Я хочу реализовать систему комментариев, это моя сущность комментариев.

 public class Comment
    {
        public int CommentId { get; set; }
        public int? ParentId  { get; set; }
        public string Content { get; set; }
        public DateTimeOffset DateCreated { get; set; }
        public DateTimeOffset DateModified { get; set; }


        public Comment Parent { get; set; }
        public ICollection<Comment> Children { get; set; }


    }

а это мои конфиги в Fluent API


        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Comment>(comment =>
            {
                comment.HasKey(c => c.CommentId);
                comment.HasIndex(c => c.ParentId);

                comment.HasOne(c => c.Parent)
                       .WithMany(c => c.Children)
                       .HasForeignKey(c => c.ParentId);
            });
        }

все в порядке, и я могу загрузить все записи с иерархией (включая родительские и дочерние) с помощью этого кода

  List<Comment> comments = await _db.Comments.Include(c => c.Children)
                .ToListAsync();

но этот код загружает все элементы, такие как дочерние элементы. Но я хочу загрузить всех родителей, потом их детей, потом внуков и....

Я использую этот код для этого сценария

List<Comment> comments = await _db.Comments.Include(c => c.Children)
                .Where(c => c.ParentId == null)
                .ToListAsync();

и этот код просто загружает всех родителей с их детьми, а не внуками и т.д. по иерархии.

Как мне написать этот запрос?

1 ответ

Решение

Я нашел решение для этого сценария.

  public async Task<IActionResult> Index()
        {

            List<Comment> comments = await _db.Comments.AsNoTrackingWithIdentityResolution()
                                                        .Include(c => c.Children)
                                                        .ToListAsync();

            // Structure Comments into a tree
            List<Comment> commentsTree = comments.Where(c => c.ParentId == null)
                                                 .AsParallel()
                                                 .ToList();

            return View(commentsTree);
        }

Другие вопросы по тегам