簡體   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