【问题标题】:Linq Lambda - Most viewed pageLinq Lambda - 浏览次数最多的页面
【发布时间】:2013-04-17 13:57:00
【问题描述】:

我有一个 C# MVC4 Web 应用程序,我正试图找出它的 linq 语句。 (如果可能,Lambda)

我有两个表,Hits 和 Posts。点击跟踪网站上每个页面的所有访问。帖子就像博客条目。当用户访问 Post 时,PostId 会记录在 Hit 表中。

表格:

点击次数 HitId、Url、PostId

帖子 PostId、PostDate 等

网站的一个类别是“观看次数最多”,它将显示按点击次数降序排列的观看次数最多的帖子列表。

最后,我使用的是 IPagedList,所以请记住最终列表需要排序。

我尝试过的:

    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 排序。

也许有更好的方法来做到这一点?

【问题讨论】:

  • 你为什么不在Where之后直接调用OrderBy
  • 你在 EF 的每个帖子中都有Hits 收藏吗?
  • 你能显示你对 PagedList 的调用吗?
  • Joey - 因为 postCount 已被“观看次数最多”排序。如果我再次调用它,那么它不会被大多数观看者订购。
  • cadrell0 - 我添加了 IPagedList。

标签: c# linq linq-to-sql asp.net-mvc-4 pagedlist


【解决方案1】:

该代码看起来非常复杂。您可以通过简单地按点击次数对帖子进行排序来将其减少为 一个 查询,如下所示:

var results = from post in _db.Posts
              join hit in _db.Hits
              on post.PostId equals hit.PostId
              group hit by post into g
              orderby g.Count() descending
              select g.Key;

return View(results.ToPagedList(page ?? 1, 5));

这将转化为如下内容:

SELECT Post.PostId, Post.PostDate, Post.Whatever, ..., COUNT(*) C
    FROM Post
    INNER JOIN Hit ON Post.PostId = Hit.PostId
    GROUP BY Post.PostId, Post.PostDate, Post.Whatever, ...
    ORDER BY C DESC
    OFFSET @offset ROWS
    FETCH NEXT @pageSize ROWS ONLY

此外,通过将.ToList() 添加到您的查询中,它将从您的数据库中获取所有内容并在内存中进行过滤,这可能会慢得多,具体取决于服务器和数据库之间的连接。

【讨论】:

    【解决方案2】:

    以下内容如何:

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

    【讨论】:

    • 谢谢乔伊 - 感谢您的帮助。 Nuffin 的回答效果很好。
    猜你喜欢
    • 2012-05-01
    • 2021-09-15
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多