複雑な選択の種類のLINQクエリに問題があります。ASP.NET MVCで投稿をコメントしたすべてのユーザーを選択してください
私は単純にソーシャルネットワークを作成しようとしています。そこでは、ユーザーが投稿を投稿したり、他のユーザーがコメントを投稿したりできます。 いくつかの統計では、現在ログオンしているユーザーのすべての投稿にコメントを残したユーザーが誰かを知りたいと思っています。
- 現在ログオンしているユーザーの検索:
これは私がプリフォームしようとしているタスクです。
- 登録されている他のすべてのユーザーを取得します(現在ログオンしている場合を除く)。
- 現在ログインしているすべての投稿に関するすべてのコメントを取得します。
- すべてのコメントにコメントを残したユーザーのIDを示すUserIdがあるので、この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ループにあると思いますが、私は頭が混乱していますが、これを別のより効率的な方法でどのように実装できるかわかりません。 また、誰かがリファクタリングできる何かを見た場合、私はここで不必要な混乱を感じたので、コメントは歓迎以上のものです。
'(U => u.Id == comment.UserIdが)'、おそらく単一のアイテムではなく、完全なリスト – Rahul
@Rahulそれをはいを返します(この方法、あなたは、ループ内のDBクエリを持っていません)しかし、私はそれらのすべての復帰を達成する方法がわかりません。 :/ –
ユーザーとコメントの間に外部キーの関係があるかどうか知っていますか?あなたの 'comment'オブジェクトは' Users'プロパティを持っていますか? – JamieD77