-
06-09-2019 - |
题
我编码这个论坛,因为我是新来的LINQ我就遇到了这个问题,当用户点击主页。我想显示的论坛列表像这样的表:
Forum --- Topics (count) --- Posts (count) --- LastPostUserId --- LastPostTime
我有以下SQL表:
Forums:
ForumId (int32),
Title (string),
Description (string)
ForumThreads:
ThreadId (int32),
ForumId (int32),
UserId (guid),
Subject (string),
Views (int32),
CreateDate (DateTime)
ForumPosts:
PostId (int32),
ThreadId (int32),
UserId (guid),
Post (string),
CreateDate (datetime)
感谢您......
解决方案
有关,如果你使用的会员,你不希望在您的dbml的aspnet_Users显示用户名:
...
LastPostUserId = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=> Membership.GetUser(p.UserId))
...
另外一个变化,让您的样品贴好一点是添加orderbydescending变量的帖子: 然后可以从select子句丢弃4次重复OrderByDescending:
from forum in Forums
let posts = ForumPosts.Where(p => p.ForumThreads.ForumId.Equals(forum.ForumId)).OrderByDescending(p=>p.PostId)
select new
{
Forum = forum.Title,
Description = forum.Description,
Topics = forum.ForumThreads.Count(),
Posts = posts.Count(),
LastPostId = posts.Take(1).Select(p=>p.PostId),
LastPostThreadId = posts.Take(1).Select(p=>p.ThreadId),
LastPostUserId = posts.Take(1).Select(p=>p.UserId),
LastPostTime = posts.Take(1).Select(p=>p.CreateDate)
}
或者甚至清洁器:
from forum in Forums
let posts = ForumPosts.Where(p => p.ForumThreads.ForumId.Equals(forum.ForumId))
let lastPost = posts.OrderByDescending(p=>p.PostId).Take(1)
select new
{
Forum = forum.Title,
Description = forum.Description,
Topics = forum.ForumThreads.Count(),
Posts = posts.Count(),
LastPostId = lastPost.PostId,
LastPostThreadId = lastPost.ThreadId,
LastPostUserId = lastPost.UserId,
LastPostUserName = Membership.GetUser(lastPost.UserId),
LastPostTime = lastPost.CreateDate
}
测试此代码时,有没有最新帖子寿,我认为这可能会引发一个错误,如果采取(1)为空..
其他提示
from forum in forums
from posts in db.ForumPosts.Where(p => p.Thread.ForumId.Equals(forum.ForumId))
select new
{
Forum = forum.Title,
Topics = forum.ForumThreads.Count(),
Posts = posts.Count(),
LastPostBy = posts.OrderByDescending(p => p.CreateDate).FirstOrDefault(p => p.UserId),
LastPostTime= posts.Max(p => p.CreateDate))
}
未经测试ofcourse,但试图从这里开始并检查SQL查询(S)后执行,让我知道,如果它需要优化。
这几乎是卓有成效的(尽管它产生一些可怕的SQL; - )...)
from forum in Forums
let posts = ForumPosts.Where(p => p.ForumThreads.ForumId.Equals(forum.ForumId))
select new
{
Forum = forum.Title,
Description = forum.Description,
Topics = forum.ForumThreads.Count(),
Posts = posts.Count(),
LastPostId = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=>p.PostId),
LastPostThreadId = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=>p.ThreadId),
LastPostUserId = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=>p.UserId),
LastPostTime = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=>p.CreateDate)
}
最后一件事 - 我有一个从SQL表“ForumPosts”的关系为“Aspnet_Users”,我想显示的列Aspnet_Users.UserName作为LastPostUserName ......这怎么办呢?而且你会如何优化整个查询?
不隶属于 StackOverflow