2

linq ステートメントを理解しようとしている C# MVC4 Web アプリがあります。(できればラムダ)

Hits と Posts の 2 つのテーブルがあります。Hits は、サイトのすべてのページへのすべての訪問を追跡します。投稿はブログエントリのようなものです。ユーザーが投稿にアクセスすると、PostId が Hit テーブルに記録されます。

テーブル:

ヒット HitId、Url、PostId

投稿 PostId、PostDate など

このサイトのカテゴリは「Most Viewed」で、最も閲覧された投稿のリストがヒット数で降順で表示されます。

最後に、私は IPagedList を使用しているので、最終的なリストは Ordered である必要があることに注意してください。

私が試したこと:

    var postCount = 
    _db.Posts.Join(_db.Hits, posts => posts.PostId, hits => hits.PostId, (posts, hits) => new { posts, hits })
    .GroupBy(num => num.posts.PostId)
    .OrderByDescending(gp => gp.Count())
    .Select(g => g.Key).ToList();

   var results = _db.Posts.Where(p => postCount.Contains(p.PostId));
   const int pageSize = 5;
   var pageNumber = (page ?? 1);
   return View(results.ToPagedList(pageNumber, pageSize));

したがって、postCount は、MostViewed によって並べ替えられた PostId のリストであり、これが私が望むものです。ただし、IPagedList を使用しているため、次のエラーが発生します。

    The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'.

どんな助けでも大歓迎です!ありがとう!

編集

助けてくれてありがとう。

.ToList() を追加すると:

    var results = _db.Posts.Where(p => all2.Contains(p.PostId)).ToList();

これでエラーは解決しますが、postCount の順序は失われます。PostId でソートされるようになりました。

多分これを行うためのより良い方法がありますか?

4

2 に答える 2