Ответ 1
Он должен войти в репозиторий, если ваш репозиторий возвращает материализованные последовательности (ICollection<T>
, List<T>
) и т.д.
Но если ваш возвращаемый IQueryable<T>
(как и я), я надеюсь, что у вас есть сервисный уровень, посредник между вашими контроллерами и репозиторием, который выполняет запросы на IQueryable и материализует их в конкретные коллекции.
Итак, я бы поместил пейджинг в сервисный уровень.
Что-то вроде этого:
public PagedList<T> Find(Expression<Func<T,bool>> predicate, int pageNumber, pageSize)
{
return repository
.Find()
.Where(predicate)
.ToPagedList(pageNumber, pageSize);
}
.ToPagedList
может быть методом расширения, который применяет требуемый пейджинг и выполняет проекты с PagedList<T>
.
Существует множество реализаций PagedList<T>
. Мне нравится Rob Conery one. Имеет свойства, которые требуется вашему представлению, поэтому вы можете привязываться к PagedList<T>
и создавать HTML-помощник, чтобы очень легко отображать номера страниц. Единственная проблема с любой реализацией LINQ с выгружаемым списком - это операция Count()
(для количества записей), которая должна быть выполнена на сервере, и, следовательно, результат в 2 раундах.
Вы не хотите возвращать неосновные запросы к вашему представлению, так как IMO это нарушает шаблон MVC.
Каждый раз, когда вы переходите на новую страницу, вызывайте свою службу, чтобы получить требуемый результат.