选择所有在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循环中,但我脑子里一团糟,不知道如何以不同且更有效的方式实现这一点。同样,如果有人看到一些可以重构的东西,评论是非常受欢迎的,因为我觉得我在这里做了不必要的混乱。
在该循环的每次迭代中都要替换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();