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

也许有更好的方法?

Linq Lambda -浏览次数最多的页面

这段代码看起来非常复杂。您可以通过简单地按命中次数对文章进行排序,将其减少到一个查询,如下所示:

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();