繁体   English   中英

最近的记录有2个表和take / skip

[英]Most recent records with 2 tables and take / skip

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

我要表:

  • 分配
  • ForumPosts

这些不是很相似,但它们都有一个“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的人,谁能给我一个暗示? 我相信有人可以加入他们的方式!

首先,您应该使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM