Linq Lambda -浏览次数最多的页面
本文关键字:Lambda 浏览 Linq | 更新日期: 2023-09-27 18:09:53
我有一个c# MVC4 web应用程序,我试图找出linq语句。(Lambda,如果可能)
我有两个表,点击和帖子。Hits跟踪网站上每个页面的所有访问。帖子就像博客条目。当用户访问Post时,PostId将被记录在Hit表中。
表:
点击hiid, Url, PostId
文章PostId, PostDate等
网站的一个类别是'Most Viewed',它将显示按点击次数下降的Most Viewed Posts列表。
最后,我使用的是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的顺序。它现在只是按postd排序。
也许有更好的方法?
标题>这段代码看起来非常复杂。您可以通过简单地按命中次数对文章进行排序,将其减少到一个查询,如下所示:
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()
添加到查询中,它将从数据库中获取所有内容并在内存中进行过滤,这可能会慢得多,具体取决于服务器和数据库之间的连接。
以下内容如何:
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();