Где пейджинг, сортировка и т.д. Входят в шаблон репозитория?

Где мы помещаем логику для пейджинга и сортировки данных в проекте шаблона репозитория asp.net?

Должен ли он перейти на сервисный уровень или поместить его в контроллер и заставить контроллер напрямую вызвать репозиторий? Контроллер → Репозиторий показан здесь для сетки jquery.

Но в отличие от этой статьи, мой репозиторий возвращает IQueryable<datatype>

Ответы

Ответ 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.

Каждый раз, когда вы переходите на новую страницу, вызывайте свою службу, чтобы получить требуемый результат.

Ответ 2

  • Сортировка: должна выполняться в репозитории для больших наборов результатов; может выполняться внутри контроллера для небольших коллекций (т.е. без подкачки).
  • Пейджинг: IMO репозиторий должен предоставить способ возврата срезов коллекции (что не совсем то же самое, что и пейджинг). Смысл, должен быть способ попросить репозиторий вернуть запрос, начиная с индекса z и для следующих y элементов. Затем все содержимое, связанное с конкретным размером страницы (или индексом страницы), должно храниться внутри контроллера. Таким образом, вы можете оптимизировать поиск данных, но не связывая свою модель с конкретным требованием к презентации.

Ответ 3

Сортировка и пейджинг - это функции данных. Он должен войти в репозиторий.

Ответ 4

Репозиторий должен возвращать "PageableResultSet" или что-то в этом роде, которое отвечает за пейджинг.