3

我想做的基本上是这个问题提供的内容:SQL Server - 如何根据两个表中的日期显示最近的记录..唯一的区别是:我使用的是 Linq to sql。

我必须表:

  • 作业
  • 论坛帖子

这些不是很相似,但它们都有一个“LastUpdated”字段。我想获取最近加入的记录。但是,我还需要用于分页的获取/跳过功能(不,我没有 SQL 2012)。

我不想用我的所有记录创建一个新列表(带有 ToList 和 AddRange),所以我知道整个记录集,然后订购.. 这似乎非常低效。

我的尝试:

请不要嘲笑我效率低下的代码.. 好吧,一点点(既是因为它效率低又......当 skip 大于 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 to SQl 人,谁能给我一个提示?我相信有人可以加入他们的出路!

4

1 回答 1

4

首先,您应该使用OrderByDescending,因为较晚的日期比较早的日期具有更大的值,以便获得最新的更新。其次,我认为您正在做的事情对于第一页是有效的,但您也只需take要从加入列表中获取最高值。也就是说,如果您希望合并两个表中的最后 20 个条目,则从每个表中获取最后 20 个条目,合并它们,然后从合并列表中获取最后 20 个条目。当您尝试使用分页时,问题就出现了,因为您需要做的是知道每个列表中有多少元素组成了前一页。我认为,您最好的选择可能是先合并它们,然后使用跳过/获取。我知道你不想听到这个,但其他解决方案可能更复杂。或者,您可以登上顶部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;
}
于 2013-01-26T20:08:20.507 回答