选择所有在ASP.NET MVC中发表评论的用户

本文关键字:评论 用户 MVC ASP NET 选择 | 更新日期: 2023-09-27 17:57:49

我在LINQ查询中遇到了一个复杂的选择问题。

我正在尝试创建一个简单的社交网络,用户可以在其中发帖,其他用户可以对其进行评论。对于一些统计数据,我想找出谁是在当前登录用户的所有帖子上留下评论的用户。

这是我试图完成的任务:

  • 查找当前登录的用户
  • 获取所有其他注册用户(当前登录的用户除外)
  • 获取当前登录用户所有帖子的所有评论
  • 由于每个评论都有UserId,它表示离开评论的用户的ID,我想将此UserId与所有其他注册用户进行比较,并获得对当前登录用户进行评论的用户列表

这听起来有点复杂,但事实并非如此。

这是我的代码:

public ActionResult ListAllUsersThatCommentedPostsToCurrentUser()
{
    ApplicationDbContext db = new ApplicationDbContext();
    //Get ID from current user
    var currentUserId = User.Identity.GetUserId();
    var user = db.Users.SingleOrDefault(x => x.Id == currentUserId);
    var comments = new List<Comment>();
    if (user != null)
    {
        //Get all posts of current user
        var postsOfCurrentUser = db.Posts.Where(x => x.UserId == user.Id).ToList();
        foreach (var post in postsOfCurrentUser)
        {
            //Get all comments on posts which belong to current user
            comments = db.Comments.Where(x => x.PostId == post.PostId).ToList();
        }
    }
    var usersThatCommentedPosts = new List<ApplicationUser>();
    if (comments != null)
    {
        //Get all user except current one
        var otherUsers = db.Users.Where(u => u.Id != currentUserId).ToList();
        foreach(var comment in comments)
        {
            //Filter all users except current one according to UserIds in Comment list
            usersThatCommentedPosts = otherUsers.Where(u => u.Id == comment.UserId).ToList();
        }
    }
    return View(usersThatCommentedPosts);
}

问题出在这一行:

usersThatCommentedPosts = otherUsers.Where(u => u.Id == comment.UserId).ToList();

我总是得到最后一个用户如何将评论留给当前用户,而不是所有留下评论的用户的列表。我想问题出在foreach循环中,但我脑子里一团糟,不知道如何以不同且更有效的方式实现这一点。同样,如果有人看到一些可以重构的东西,评论是非常受欢迎的,因为我觉得我在这里做了不必要的混乱。

选择所有在ASP.NET MVC中发表评论的用户

在该循环的每次迭代中都要替换usersThatCommentedPosts。如果要附加到循环,请使用AddRange

var users = otherUsers.Where(u => u.Id == comment.UserId).ToList();
usersThatCommentedPosts.AddRange(users );

或者更好的是,在适当的查询中进行联接。(这样就不会在循环中进行数据库查询)

var userQry =
    from post in db.Posts
    join comment in db.Comments on post.PostId equals comment.PostId
    join otherUser in db.Users on comment.UserId equals otherUser.Id
    where post.UserId == currentUserId
    where otherUser.Id != currentUserId
    select otherUser;
var users = userQry.ToList();