3

私がやりたいことは、基本的にこの質問が提供するものです: SQL Server - 2 つのテーブルの日付に基づいて最新のレコードを表示する方法..唯一の違いは、Linq to sql を使用していることです。

私はテーブルにいる必要があります:

  • 課題
  • フォーラム投稿

これらはあまり似ていませんが、どちらにも「LastUpdated」フィールドがあります。結合された最新のレコードを取得したい。ただし、ページング用のテイク/スキップ機能も必要です (いいえ、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 への素晴らしい人々で、ヒントを教えてくれる人はいますか? 私は誰かがこれから抜け出すことができると確信しています!

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 に答える