У меня проблемы с выяснением того, как включить список дочерних свойств, которые могут иметь собственный список дочерних свойств.
Моя сущность настроена следующим образом:
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": []
}
]