Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
社交网络LINQ查询:如何执行好友提要?_Linq_Asp.net Mvc 3_Entity Framework_C# 4.0 - Fatal编程技术网

社交网络LINQ查询:如何执行好友提要?

社交网络LINQ查询:如何执行好友提要?,linq,asp.net-mvc-3,entity-framework,c#-4.0,Linq,Asp.net Mvc 3,Entity Framework,C# 4.0,我有一个社交网站,我很难筛选谁能看到用户发布的更新 就像在Facebook上一样,我看到了我朋友的所有帖子,即使我没有发布任何东西。 我有这些桌子: 日志表: -------------------------------------- | ID | UserID | Content | UpdateTime | -------------------------------------- 朋友表: -------------------------- | ID | UserID | Frie

我有一个社交网站,我很难筛选谁能看到用户发布的更新

就像在Facebook上一样,我看到了我朋友的所有帖子,即使我没有发布任何东西。 我有这些桌子:

日志表:

--------------------------------------
| 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子句,但没有成功。
您对如何编写此查询有何建议?

您尝试了哪些失败的方法?您可以尝试将where子句移动到动态选择查询之外:

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

这将确保您在进入动态选择之前过滤结果。

您尝试了哪些失败的操作?您可以尝试将where子句移动到动态选择查询之外:

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

这将确保您在进入动态选择之前过滤结果。

您应该在数据库和数据层(在实体图中)中设置关系。如果是这样,您应该通过使用导航属性而不是使用递归数据库调用来依赖这些关系。考虑这一点:对于DIALYPOST表中的每个项目,您将调用2个数据库。因此,6个POST=总共13个数据库调用(1个用于获取POST,然后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();

您应该在数据库和数据层(在实体图中)中设置关系。如果是这样,您应该通过使用导航属性而不是使用递归数据库调用来依赖这些关系。考虑这一点:对于DIALYPOST表中的每个项目,您将调用2个数据库。因此,6个POST=总共13个数据库调用(1个用于获取POST,然后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();
我想你需要这样的东西,请检查语法,如果你喜欢的话,你可以用join代替let

我想你需要这样的东西,请检查语法,如果你喜欢的话,你可以用join代替let

答案是:

//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();
答案是:

//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();

你以前是怎么写where子句的?where d.UserID=(db.Friends.where(m=>m.UserID==id.ToList())你以前是怎么写where子句的?where d.UserID=(db.Friends.where(m=>m.UserID==id.ToList())我同意你的建议@Rondel,但是我该如何执行第二个语句呢,如果我需要带所有允许的追随者和朋友ID,如果是列表?我同意你的建议@Rondel,但是如果我需要带所有允许的追随者和朋友ID,如果是列表,我将如何执行第二个声明?谢谢你的回答@Ad.Net,但我使用此查询来显示我的用户配置文件,其中我只需要列出我自己的日志。这似乎是一个很好的查询,但当我第二次使用var-friendsId时,它似乎处于错误的上下文中,错误告诉我int不包含AnyTry-friendsId的定义。Contains(d.UserID)感谢您的回答@Ad.Net,但我使用此查询来显示我的用户配置文件,我只需要列出我自己的日志。这似乎是一个很好的查询,但当我第二次使用var-friendsId时,它似乎处于错误的上下文中,错误告诉我int不包含AnyTry-friendsId.Contains(d.UserID)的定义