选择在ASP.NET MVC中评论过帖子的所有用户

时间:2016-07-20 18:29:21

标签: c# asp.net-mvc linq

我在使用LINQ查询时遇到了一些复杂选择的问题。

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

这是我正在尝试执行的任务:

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

听起来有点复杂,但实际上并非如此。

这是我的代码:

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循环中,但我头脑中一团糟,不知道如何以一种不同的,更有效的方式实现它。 同样,如果有人看到可以重构的内容,则评论非常受欢迎,因为我觉得我在这里做了不必要的混乱。

1 个答案:

答案 0 :(得分:4)

你正在替换该循环的每次迭代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();