Этот метод выполняет SQL-запрос перед фильтрацией и разбиением на страницы? - PullRequest
0 голосов
/ 27 июля 2011
public ActionResult Index(int ehrId, int? page)
        {
            EHR ehr = ehrRepository.Find(ehrId);
            if (ehr.UserName != User.Identity.Name)
                return View("Invalid Owner");
            const int pageSize = 5;
            var physicaltests = ehr.PhysicalTests.OrderByDescending(test => test.CreationDate);
            List<PhysicalTestListItem> physicalTestsVM = new List<PhysicalTestListItem>();
            Mapper.Map(physicaltests, physicalTestsVM);
            var paginatedTests = new PaginatedList<PhysicalTestListItem>(physicalTestsVM, page ?? 0, pageSize);
            return View(paginatedTests);
        }

это класс пагинации (по крайней мере, что с ним связано)

 public class PaginatedList<T> : List<T>
        {

            public int PageIndex { get; private set; }
            public int PageSize { get; private set; }
            public int TotalCount { get; private set; }
            public int TotalPages { get; private set; }

            public PaginatedList(IEnumerable<T> source, int pageIndex, int pageSize)
            {
                PageIndex = pageIndex;
                PageSize = pageSize;
                TotalCount = source.Count();
                TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);

                this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
            }
}

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

Пожалуйста, помогите.

1 Ответ

1 голос
/ 27 июля 2011

Этот код определенно выполняется на стороне клиента (вы используете IENumerable, а не IQuerable, поэтому выполнение запроса не откладывается).

Если вы хотите подкачки в базе данных, добавьте свой код подкачки к вызову EF:

  var physicaltests = ehr.PhysicalTests.OrderByDescending(test => test.CreationDate).Skip(currentPage * pageSize).Take(pageSize);

Другие мысли:

Вы можете передать результат запроса EF в PaginatedList и изменить его, чтобы использовать IQueryable вместо IEnumerable. Это позволило бы вам сохранить контейнер PaginatedList ... Однако это утечка абстракции EF и приводит к тому, что он пропускает код типа базы данных в ваш интерфейс.

Я обычно реализую доступ к базе данных на уровне хранилища и предоставляю метод, который возвращает IEnumerable. Контроллер взаимодействует только с этим методом ... Что-то вроде:

   return View(physicalTestRepository.GetPage(pageIndex,pageSize));
...