У меня есть веб-приложение C# MVC4, которое я пытаюсь выяснить для инструкции linq. (Lambda если возможно)Linq Lambda - Самая популярная страница
У меня есть две таблицы, хиты и сообщения. Hits отслеживает все посещения каждой страницы сайта. Сообщения похожи на записи в блогах. Когда пользователь посещает сообщение, PostId записывается в таблицу Hit.
Таблицы:
Hits HitId, URL, сообщения дан
Сообщений сообщения дан, постдатировать и т.д.
Категория на сайте 'Самые популярные', который будет показывать Список самых популярных сообщений по убыванию.
Наконец, я использую 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, который является тем, что я хочу. Однако, поскольку я использую IPagedList, я получаю эту ошибку:
The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'.
Любая помощь приветствуется! Благодаря!
EDIT
Спасибо за каждого, кто пытается помочь.
Если добавить .ToList():
var results = _db.Posts.Where(p => all2.Contains(p.PostId)).ToList();
Это устраняет ошибку, но она по-прежнему теряет порядок, postCount имеет. Теперь это просто отсортировано по PostId.
Возможно, есть лучший способ сделать это?
Почему вы просто не называют 'OrderBy' после' Where'? –
У вас есть коллекция 'Hits' в каждом посте в EF? –
Можете ли вы показать свой вызов PagedList? – cadrell0