【发布时间】: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