我在使用LINQ查询时遇到了一些复杂选择的问题。
我正在尝试创建简单的社交网络,用户可以发布帖子,其他用户可以对其进行评论。 对于某些统计信息,我想找出谁是当前登录用户的所有帖子留下评论的用户。
这是我正在尝试执行的任务:
听起来有点复杂,但实际上并非如此。
这是我的代码:
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循环中,但我头脑中一团糟,不知道如何以一种不同的,更有效的方式实现它。 同样,如果有人看到可以重构的内容,则评论非常受欢迎,因为我觉得我在这里做了不必要的混乱。
答案 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();