Как мне выставить общее количество записей и IEnumable коллекцию постраничных записей из моего метода сервисного уровня? - PullRequest
8 голосов
/ 21 июня 2011

Сначала я использую EF4 с кодом, у меня есть хранилище для сохранения и сервисный уровень, который взаимодействует с ним. У меня есть метод сервисного уровня, который вызывает метод IQueryable в моем хранилище и возвращает IEnumerable, содержащий сущности. Мне также нужно вернуть общее количество записей, чтобы я мог рассчитать ссылки на пейджинг.

Как мне вернуть int и IEnumerable из моего метода обслуживания?

  • Использовать выходной параметр в методе для общего количества строк
  • Создайте отдельный класс, который включает общее количество строк в качестве свойства
  • Переместить пейджинговый запрос LINQ из уровня обслуживания (открыть IQueryable из репозитория на уровне обслуживания)
  • Создать полностью отдельный метод на уровне сервиса, который выполняет новый запрос только для подсчета.

Все это должно работать, но какой из них самый чистый?

ОБНОВЛЕНИЕ: Вот некоторые разъяснения архитектуры. Если это не так, то, пожалуйста, скажите мне лучший способ (например, делайте пейджинг на уровне представления вместо уровня обслуживания и т. Д.)

Слой репо:

возвращает IQueryable из DbSet, абстрагирует доступ к БД из уровня представления

Сервисный уровень:

делает запрос LINQ к IQueryable для фильтрации и просто получает элементы страницы по мере необходимости, используя skip and take и возвращает IEnumerable (собирается также установить List по возвращении, чтобы избежать любых проблем с временем жизни DbContext)

Презентационный слой:

Вызов метода на уровне службы (getPagedResults (filters, pageNumber, pageSize))

Судя по всему, мне также потребуется добавить отдельный метод для получения общих результатов. Надеюсь сделать все это в один звонок.

Я бы предпочел не возвращать все записи в презентацию, а затем страница ... кажется неэффективной.

Ответы [ 2 ]

8 голосов
/ 21 июня 2011

Вы можете сделать что-то вроде этого

public class Repository<TEntity>
{
   public IEnumerable<TEntity> GetCollection(Expression<Func<TEntity, bool>> filter, 
      int pageSize, int pageIndex)
   {
      return YourDbSet.Where(filter).OrderBy(sortExpression).Skip(pageSize * pageIndex).Take(pageSize);
   }

   public int Count(Expression<Func<TEntity, bool>> filter)
   {
      return YourDbSet.Where(filter).Count();
   }
}

Затем Вы можете написать метод расширения для использования обоих этих методов

public static Pagination<TEntity> GetPagination<TEntity>(this Repository<TEntity> repository, 
   Expression<Func<TEntity, bool>> filter, int pageSize, int pageIndex)
{
   var entities = repository.GetCollection(filter, pageSize, pageIndex);
   var count = repository.Count(filter);

   return new Pagination(entities, pageSize, pageIndex + 1, count);
}

Таким образом, вы можете повторно использовать GetCollection и Count методы самостоятельно.Вы можете построить условие where динамически.Взгляните на мой ответ

1 голос
/ 21 июня 2011

Если Enumerable, который вы возвращаете, содержит все элементы, я бы сделал ToList() перед возвратом из функции.(затем вы можете сделать Count без затрат). Если функция возвращает подмножество итогов (используя Skip и take), я бы добавил отдельную функцию, чтобы получить общее количество.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...