社交网络LINQ查询:如何执行好友提要?
我有一个社交网站,我很难筛选谁能看到用户发布的更新 就像在Facebook上一样,我看到了我朋友的所有帖子,即使我没有发布任何东西。 我有这些桌子: 日志表:社交网络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
--------------------------------------
| 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)的定义