2011-12-05 5 views
1

私はソーシャルネットワーキングのウェブサイトを持っており、ユーザが投稿したアップデートを誰が見ることができるかをフィルタリングするのが難しくなってきています。ソーシャルネットワークのLINQクエリ:友達フィードを実行する方法?

Facebookと同じように、私は何も投稿しなかったとしても、私の友人からのすべての投稿を見ます。 私はこれらのテーブルを持っている:

DiaryPostsテーブル:

-------------------------------------- 
| ID | UserID | Content | UpdateTime | 
-------------------------------------- 

友達テーブル:

-------------------------- 
| ID | UserID | FriendID | 
-------------------------- 

フォロワーテーブル:

---------------------------- 
| ID | UserID | FollowerID | 
---------------------------- 

そして私は今、それができるこのクエリを持っています」フィルタリングするもの:

var diaryPosts = (from d in db.DiaryPosts 
        orderby d.ID descending 
        select new DiaryPostsSet 
        { 
         PostID = d.ID, 
         Author = db.User.Where(m => m.ID == d.UserID).FirstOrDefault().Nickname, 
         Thumbnail = db.User.Where(m => m.ID == d.UserID).FirstOrDefault().Thumbnail, 
         AuthorComment = d.Content, 
         UserID = d.UserID, 
         Time = d.UpdateTime }).Take(6).ToList(); 

where節を作成しようとしましたが、動作しませんでした。 このクエリの記述方法に関するご提案はありますか?

+0

以前にWHERE句を記述してみましたか? – Rondel

+0

ここで、d.UserID =(db.Friends.Where(m => m.UserID == id).ToList()) –

答えて

0

答えは次のとおりです。

//queries for diary Posts 
     var myDiaryPosts = (from d in db.DiaryPosts 
           join e in db.EstadosDeAlma 
           on d.EstadosDeAlmaID equals e.ID 
           join u in db.User 
           on d.UserID equals u.ID 
           where d.UserID == userset.ID 
           select new DiaryPostsSet { 
            PostID = d.ID, 
            EstadoDeAlmaID = e.ID, 
            EstadoDeAlma = e.Title, 
            Author = u.Nickname, 
            Thumbnail = u.Thumbnail, 
            UserID = u.ID, 
            IsDuplicated = d.IsDuplicated, 
            FriendID = d.FriendID, 
            FriendName = u.Nickname, 
            Time = d.UpdateTime, 
            MessagesCount = d.FriendMessages.Count(m => m.DiaryPostsID == d.ID) 
           }); 

     var friendsPosts = (from d in db.DiaryPosts 
           join e in db.EstadosDeAlma 
           on d.EstadosDeAlmaID equals e.ID 
           join fr in db.Friends 
           on d.UserID equals fr.FriendID 
           where fr.UserID == userset.ID 
           join u in db.User 
           on fr.FriendID equals u.ID 
           select new DiaryPostsSet 
           { 
            PostID = d.ID, 
            EstadoDeAlmaID = e.ID, 
            EstadoDeAlma = e.Title, 
            Author = u.Nickname, 
            Thumbnail = u.Thumbnail, 
            UserID = u.ID, 
            IsDuplicated = d.IsDuplicated, 
            FriendID = d.FriendID, 
            FriendName = u.Nickname, 
            Time = d.UpdateTime, 
            MessagesCount = d.FriendMessages.Count(m => m.DiaryPostsID == d.ID) 
           }); 

     var followingsPosts = (from d in db.DiaryPosts 
           join e in db.EstadosDeAlma 
           on d.EstadosDeAlmaID equals e.ID 
           join fl in db.Followers 
           on d.UserID equals fl.UserID 
           where fl.FollowerID == userset.ID 
           join u in db.User 
           on fl.UserID equals u.ID 
           select new DiaryPostsSet 
           { 
            PostID = d.ID, 
            EstadoDeAlmaID = e.ID, 
            EstadoDeAlma = e.Title, 
            Author = u.Nickname, 
            Thumbnail = u.Thumbnail, 
            UserID = u.ID, 
            IsDuplicated = d.IsDuplicated, 
            FriendID = d.FriendID, 
            FriendName = u.Nickname, 
            Time = d.UpdateTime, 
            MessagesCount = d.FriendMessages.Count(m => m.DiaryPostsID == d.ID) 
           }); 

     var diaryPosts = myDiaryPosts.Union(friendsPosts).Union(followingsPosts).OrderByDescending(d => d.Time).Take(6).ToList(); 
0

あなたは何を試しましたか?あなたは、動的選択クエリの外にあなたのwhere句を移動してみてくださいすることができます

var diaryPosts = (from d in db.DiaryPosts 
       where d.UserID==2 && d.SomethingElse=="someValue" 
       orderby d.ID descending 
       select new DiaryPostsSet 
       { 
       .... 

あなたの動的選択に入る前に、これはあなたが結果をフィルタリングしていることを確認します。

+0

私はあなたの提案に同意します@Rondel、フォロワーとフレンドのすべての許可されたIDを持っていて、それがリストの場合は? –

0

データベース内とデータ層内(エンティティ図内)にリレーションシップが設定されている必要があります。その場合は、再帰的なデータベース呼び出しを使用するのではなく、ナビゲーションプロパティを使用してそれらの関係に依存する必要があります。これを考慮してください:あなたのDiaryPostsテーブルの各項目に対して、データベースへの呼び出しを2回行います。したがって、6つの投稿= 13のデータベース呼び出し合計(1つは投稿を取得し、次に6x2はユーザーを取得)。

あなたのクエリは次のようになります。

var diaryPosts = (from d in db.DiaryPosts 
        orderby d.ID descending 
        select new DiaryPostsSet 
        { 
         PostID = d.ID, 
         Author = d.Author.Nickname, 
         Thumbnail = d.Author.Thumbnail, 
         AuthorComment = d.Content, 
         UserID = d.UserID, 
         Time = d.UpdateTime }).Take(6).ToList(); 
+0

あなたのアドバイスありがとう=) –

1
 var diaryPosts = (from d in db.DiaryPosts 
let friendsId = d.Friends.Select(f=>f.FriendID) 
where d.UserID == currentUserId || friendsId.Any(d.UserID) 
          orderby d.ID descending 
          select new DiaryPostsSet 
          { 
           PostID = d.ID, 
           Author = d.Author.Nickname, 
           Thumbnail = d.Author.Thumbnail, 
           AuthorComment = d.Content, 
           UserID = d.UserID, 
           Time = d.UpdateTime 
          }).Take(6).ToList(); 

私はあなたがこのようなものが必要だと思う、plzは構文をチェックして、あなたが好きなら聞かせての代わりに参加を思い付くことができます。

+0

あなたの答え@ Ad.Netに感謝しますが、このクエリを使用して自分のユーザープロフィールを表示します。ここで自分の日記の投稿のみをリストする必要があります。 –

+0

アップデートがうまくいくかどうか教えてください。 –

+0

これは良いクエリだと思われますが、2回目にvar friendsを使用した場合、間違ったコンテキストにあるようですが、intには何も定義されていないことがわかります –

関連する問題