EF Core - проблема с включением списка дочерних свойств, которые имеют свой собственный список дочерних свойств - PullRequest
0 голосов
/ 10 февраля 2019

У меня проблемы с выяснением того, как включить список дочерних свойств, которые могут иметь собственный список дочерних свойств.

Моя сущность настроена следующим образом:

public class Comment
    {
        [Key]
        public Guid Id { get; set; }

        //other properties

        public Guid? ParentCommentId { get; set; }

        public Comment ParentComment { get; set; }

        public ICollection<Comment> ChildComments { get; set; }

        [Required]
        public Guid PostId { get; set; }

        [Required]
        public Post CommentForPost { get; set; }

        [Required]
        public Guid UserId { get; set; }

        [Required]
        public User CreatedBy { get; set; }
    }

Iиметь следующие отношения:

  • отношение один-ко-многим между Post -> Comment
  • отношение один-ко-многим между User -> Comment
  • Отношения один-ко-многим между Comment -> Comment

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

В настоящее время у меня ниже настройки оператора LINQ:

return _context.Comments.Include(comment => comment.CreatedBy)
                        .Include(comment => comment.ChildComments)
                        .ThenInclude(x => x.CreatedBy)
                        .Where(comment => comment.PostId == postId)
                        .OrderBy(comment => comment.Created)
                        .AsNoTracking();

Проблема в том, что я также получаю дубликаты.Например, если я проверю выше с данными ниже:

Comment1 {
  Id = 1
  ChildComments = Comment2
}
Comment2 {
  Id = 2
  ParentCommentId = 1
  ChildComments = Comment3
}
Comment3 {
  Id = 3
  ParentCommentId = 2
  ChildComments = null
}
Comment4 {
  Id = 4
  ChildComments = null
}

Если я использую запрос выше, я получаю ниже.То, что я хочу получить, это просто список комментариев родительского уровня и все их дочерние комментарии (и, если у дочерних комментариев есть свои собственные дочерние комментарии, включите их).

Неправильно:

[
    {
        "id": "1",       
        "parentCommentId": null,
        "childComments": [
            {
                "id": "2",                
                "parentCommentId": "1",
                "childComments": [
                    {
                        "id": "3",                        
                        "parentCommentId": "2",
                        "childComments": []
                    }
                ]
            }
        ]
    },
    {
        "id": "2",       
        "parentCommentId": "1",
        "childComments": [
            {
                "id": "3",               
                "parentCommentId": "2",
                "childComments": []
            }
        ]
    },
    {
        "id": "3",       
        "parentCommentId": "2",
        "childComments": []
    },
    {
        "id": "4",       
        "parentCommentId": null,
        "childComments": []
    }
]

Что я хочу получить обратно:

[
    {
        "id": "1",       
        "parentCommentId": null,
        "childComments": [
            {
                "id": "2",                
                "parentCommentId": "1",
                "childComments": [
                    {
                        "id": "3",                        
                        "parentCommentId": "2",
                        "childComments": []
                    }
                ]
            }
        ]
    },
    {
        "id": "4",       
        "parentCommentId": null,
        "childComments": []
    }
]

Обновление: Я попытался добавить предложение where дляParentCommentId == null поэтому модифицированный запрос выглядит так:

return _context.Comments.Include(comment => comment.CreatedBy)
                                    .Include(comment => comment.ChildComments)
                                    .ThenInclude(x => x.CreatedBy)
                                    .Where(comment => comment.PostId == postId)
                                    .Where(comment => comment.ParentCommentId == null)
                                    .OrderBy(comment => comment.Created)
                                    .AsNoTracking();

Но проблема в том, что с приведенным выше оператором linq я не получаю детей от детей.Т.е. с моим примером выше я получаю ниже вместо правильного ответа.

[
    {
        "id": "1",       
        "parentCommentId": null,
        "childComments": [
            {
                "id": "2",                
                "parentCommentId": "1",
                "childComments": []
            }
        ]
    },
    {
        "id": "4",       
        "parentCommentId": null,
        "childComments": []
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...