我想要做的,基本上就是这个问题提供的内容:SQL Server - How to display most recent records based on dates in two tables ..唯一不同的是:我正在使用Linq来实现sql。
我需要表格:
这些不是很相似,但它们都有一个“LastUpdated”字段。我想获得最新的联合记录。但是,我还需要一个take / skip功能进行分页(不,我没有SQL 2012)。
我不想创建一个包含所有记录的新列表(带有ToList和AddRange),所以我知道整个记录集,然后订购..这似乎非常低效。
我的尝试:
请不要嘲笑我效率低下的代码..好吧,一点点(因为它效率低下而且......当跳过超过0时它不能做我想要的)。
public List<TempContentPlaceholder> LatestReplies(int take, int skip)
{
using (GKDBDataContext db = new GKDBDataContext())
{
var forumPosts = db.dbForumPosts.OrderBy(c => c.LastUpdated).Skip(skip).Take(take).ToList();
var assignMents = db.dbUploadedAssignments.OrderBy(c => c.LastUpdated).Skip(skip).Take(take).ToList();
List<TempContentPlaceholder> fps =
forumPosts.Select(
c =>
new TempContentPlaceholder()
{
Id = c.PostId,
LastUpdated = c.LastUpdated,
Type = ContentShowingType.ForumPost
}).ToList();
List<TempContentPlaceholder> asm =
assignMents.Select(
c =>
new TempContentPlaceholder()
{
Id = c.UploadAssignmentId,
LastUpdated = c.LastUpdated,
Type = ContentShowingType.ForumPost
}).ToList();
fps.AddRange(asm);
return fps.OrderBy(c=>c.LastUpdated).ToList();
}
}
任何真棒的Linq到SQl的人,谁能给我一个暗示?我相信有人可以加入他们的行列!
答案 0 :(得分:4)
首先,您应该使用OrderByDescending
,因为以后的日期值比早期日期更大,以便获取最新的更新。其次,我认为你正在做的事情对第一页起作用,但你只需要从连接列表中获取最高take
值。也就是说,如果您希望将两个表中的最后20个条目组合在一起,则从每个表中取出最后20个条目,合并它们,然后从合并列表中获取最后20个条目。当您尝试使用分页时会出现问题,因为您需要知道每个列表中有多少元素用于组成前一页。我认为,你最好的选择可能是首先将它们合并,然后使用skip / take。我知道你不想听到这个,但其他解决方案可能更复杂。或者,您可以从每个表中获取前skip+take
个值,然后合并,跳过skip
值并应用take
。
using (GKDBDataContext db = new GKDBDataContext())
{
var fps = db.dbForumPosts.Select(c => new TempContentPlaceholder()
{
Id = c.PostId,
LastUpdated = c.LastUpdated,
Type = ContentShowingType.ForumPost
})
.Concat( db.dbUploadedAssignments.Select(c => new TempContentPlaceholder()
{
Id = c.PostId,
LastUpdated = c.LastUpdated,
Type = ContentShowingType.ForumPost
}))
.OrderByDescending( c => c.LastUpdated )
.Skip(skip)
.Take(take)
.ToList();
return fps;
}