Сначала я использую EF4 с кодом, у меня есть хранилище для сохранения и сервисный уровень, который взаимодействует с ним. У меня есть метод сервисного уровня, который вызывает метод IQueryable в моем хранилище и возвращает IEnumerable, содержащий сущности. Мне также нужно вернуть общее количество записей, чтобы я мог рассчитать ссылки на пейджинг.
Как мне вернуть int и IEnumerable из моего метода обслуживания?
- Использовать выходной параметр в методе для общего количества строк
- Создайте отдельный класс, который включает общее количество строк в качестве свойства
- Переместить пейджинговый запрос LINQ из уровня обслуживания (открыть IQueryable из репозитория на уровне обслуживания)
- Создать полностью отдельный метод на уровне сервиса, который выполняет новый запрос только для подсчета.
Все это должно работать, но какой из них самый чистый?
ОБНОВЛЕНИЕ: Вот некоторые разъяснения архитектуры. Если это не так, то, пожалуйста, скажите мне лучший способ (например, делайте пейджинг на уровне представления вместо уровня обслуживания и т. Д.)
Слой репо:
возвращает IQueryable из DbSet, абстрагирует доступ к БД из уровня представления
Сервисный уровень:
делает запрос LINQ к IQueryable для фильтрации и просто получает элементы страницы по мере необходимости, используя skip and take и возвращает IEnumerable (собирается также установить List по возвращении, чтобы избежать любых проблем с временем жизни DbContext)
Презентационный слой:
Вызов метода на уровне службы (getPagedResults (filters, pageNumber, pageSize))
Судя по всему, мне также потребуется добавить отдельный метод для получения общих результатов. Надеюсь сделать все это в один звонок.
Я бы предпочел не возвращать все записи в презентацию, а затем страница ... кажется неэффективной.