2016-07-20 15 views
0

複雑な選択の種類の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ループにあると思いますが、私は頭が混乱していますが、これを別のより効率的な方法でどのように実装できるかわかりません。 また、誰かがリファクタリングできる何かを見た場合、私はここで不必要な混乱を感じたので、コメントは歓迎以上のものです。

+0

'(U => u.Id == comment.UserIdが)'、おそらく単一のアイテムではなく、完全なリスト – Rahul

+0

@Rahulそれをはいを返します(この方法、あなたは、ループ内のDBクエリを持っていません)しかし、私はそれらのすべての復帰を達成する方法がわかりません。 :/ –

+0

ユーザーとコメントの間に外部キーの関係があるかどうか知っていますか?あなたの 'comment'オブジェクトは' Users'プロパティを持っていますか? – JamieD77

答えて

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(); 
+0

これは、ありがとうSamです! :) @SamIAm –

+0

@ nemo_87あなたはおそらくその機能全体を私が投稿した結合クエリで置き換えることができます。あなたはSQLとLinqを勉強して、そのようなクエリとそれがうまくいかしているかを理解することができます。 DBとやりとりするプロジェクトに取り組んでいるなら、多くの手助けをします –

関連する問題