Объединение таблиц в EF Core Linq Query - PullRequest
0 голосов
/ 23 октября 2018

В настоящее время я пытаюсь создать Web Api с EF Core и сталкиваюсь с некоторыми проблемами при объединении таблиц, которые я собрал.Я работаю со следующей диаграммой базы данных: enter image description here

И данные, которые я сейчас получаю из моего API, выглядят так:

[  
   {  
      "postId":1,
      "postDate":"2018-10-21T21:56:43.9838536",
      "content":"First entry in posts!",
      "user":{  
         "userId":1,
         "creationDate":"2018-10-21T21:56:36.3539549",
         "name":"Hansel"
      },
      "comments":[  
         {  
            "commentId":1,
            "postDate":"0001-01-01T00:00:00",
            "content":"Nice!",
            "user":null
         },
         {  
            "commentId":2,
            "postDate":"0001-01-01T00:00:00",
            "content":"Cool, here's another comment",
            "user":null
         },
         {  
            "commentId":3,
            "postDate":"0001-01-01T00:00:00",
            "content":"and the last one for the night",
            "user":null
         }
      ]
   },
   {  
      "postId":2,
      "postDate":"2018-10-22T21:56:44.0650102",
      "content":"Its good to see that its working!",
      "user":{  
         "userId":2,
         "creationDate":"2018-10-16T21:56:36.4585213",
         "name":"Chris"
      },
      "comments":[  

      ]
   }
]

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

мой текущий запрос выглядит следующим образом (я использую DTO для очистки сгенерированного JSON):

var result = from post in context.Posts
                join user in context.Users 
                on post.User.UserId equals user.UserId
                join comment in context.Comments                            
                on post.PostId equals comment.Post.PostId into comments
                select new PostDTO
                {
                    Content = post.Content,
                    PostDate = post.PostDate,
                    User = UserDTO.UserToDTO(user),
                    Comments = CommentDTO.CommentToDTO(comments.ToList()),
                    PostId = post.PostId
                };

Если я работал с SQL, я 'Я бы присоединился к пользователям в «комментарии», но я не могу, поэтому я попробовал аналогичное решение, которое, я думал, будет работать.

var result = from post in context.Posts
                join user in context.Users on post.User.UserId equals user.UserId
                join comment in 
                    (from u in context.Users
                    join c in context.Comments
                    on u.UserId equals c.User.UserId select c)
                on post.PostId equals comment.Post.PostId into comments
                select new PostDTO
                {
                    Content = post.Content,
                    PostDate = post.PostDate,
                    User = UserDTO.UserToDTO(user),
                    Comments = CommentDTO.CommentToDTO(comments.ToList()),
                    PostId = post.PostId
                };

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

TLDR;Я могу присоединиться к пользователю, чтобы оставлять сообщения и комментировать, но я не могу связать пользователя с комментарием

Я надеюсь, что вы сможете мне помочь, заранее спасибо:)

Редактировать: Вот мои модели

public class Comment
{
    public int CommentId { get; set; }
    public DateTime PostDate { get; set; }
    public string Content { get; set; }

    public User User { get; set; }

    public Post Post { get; set; }
}

  public class User
    {
        public int UserId { get; set; }
        public DateTime CreationDate { get; set; }
        public string Name{ get; set; }

        public ICollection<Post> Posts { get; set; }
        public ICollection<Comment> Comments { get; set; }
    }

public class Post
{
    public int PostId { get; set; }
    public DateTime PostDate { get; set; }
    public string Content { get; set; }
    public User User { get; set; }

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

1 Ответ

0 голосов
/ 24 октября 2018

Чтобы получать сообщения с комментариями (и каждым пользователем комментария) и пользователей, просто используйте .Include()

var res = this._dbContext.Posts
        .Include(p => p.User)
        .Include(p => p.Comments)
            .ThenInclude(c => c.User)
        .ToList();

enter image description here

Если вам не нравится вводить стороннюю библиотеку, такую ​​как AutoMapper, вы можете создать и использовать convertPostToDto функцию.

res.Select (p => convertPostToDto(p))

для преобразования res в результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...