LINQ-запрос для социальной сети: как выполнить фид друзей? - PullRequest
1 голос
/ 05 декабря 2011

У меня есть веб-сайт социальной сети, и я испытываю некоторые трудности с фильтрацией, который может видеть обновления, публикуемые пользователями.

Как и в 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, но оно не сработало.Есть ли у вас какие-либо предложения о том, как написать этот запрос?

Ответы [ 4 ]

1 голос
/ 05 декабря 2011
        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();

Я думаю, что вам нужно что-то вроде этого, пожалуйста, проверьте синтаксис, и вы можете создать объединение вместо let, если хотите.

0 голосов
/ 08 декабря 2011

Ответ:

//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 голосов
/ 05 декабря 2011

У вас должны быть настроены отношения в вашей базе данных и на вашем уровне данных (на вашей диаграмме сущностей). Если это так, вы должны полагаться на эти отношения, используя свойства навигации, а не рекурсивные вызовы базы данных. Учтите это: для каждого из элементов в вашей таблице 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 голосов
/ 05 декабря 2011

Что вы попробовали, что не получилось? Вы можете попробовать переместить предложение where за пределы динамического запроса select:

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

Это обеспечит фильтрацию результатов, прежде чем вы перейдете к своему динамическому выделению.

...