Подтвердить что ты не робот

Реализация пейджера через службу WCF

Я разрабатываю приложение, которое включает службу WCF и ее клиент ASP.NET MVC. Веб-сайт ASP.NET MVC должен отображать сетку объектов - скажем, продуктов. Эти продукты хранятся в базе данных, доступной через службу WCF. Поэтому где-то внутри контроллера MVC я вызываю метод службы WCF, который возвращает мне массив продуктов, которые мне нужно отображать.

Так в чем мой вопрос? Я хочу реализовать функцию пейджера для моей сетки продуктов, потому что возможно, что будет много продуктов. Таким образом, есть несколько способов сделать это:

  • Мой контроллер может получить весь список продуктов и просто выполнять подкачку в памяти
  • WCF может выбирать все продукты и хранить их где-то в своем кеше, а затем передавать их только контроллеру в соответствии с запрошенным номером страницы.
  • WCF может выбрать только часть продуктов из базы данных в соответствии с запрошенным номером страницы.
  • WCF может вернуть IQueryable в контроллер, а затем контроллер будет выбирать все, что захочет, когда захочет.

Насколько я понимаю (и исправляю, если это не так), первый вариант бесполезен, поэтому я должен выбирать между другими.

Второй вариант меняет память моего сервера.

Третий вариант в порядке, но кажется немного уродливым реализовать пейджинг на стороне WCF.

И четвертый вариант кажется запутанным. Я фактически передаю какой-то запрос клиенту, а затем он сам запрашивает мою базу данных через службу WCF. Я не могу понять, как правильно это реализовать.

Так что, пожалуйста, помогите мне выбрать правильный способ реализовать это?

4b9b3361

Ответ 1

Как выглядит ваш базовый уровень базы данных? Если вы используете LINQ (-to-SQL или -to-Entities), вы можете реализовать подкачку через WCF, указав размер страницы и нужный номер страницы, а затем используйте LINQ "Пропустить" и "Возьмите" операторы для извлечения запрашиваемая страница - примерно такая же:

[ServiceContract]
public interface IFetchData
{
  [OperationContract]
  public List<Data> GetData(int pageSize, int pageNumber)
}

а затем реализовать его как-то вроде этого (упрощенного):

public class FetchDataService : IFetchData
{
  public List<Data> GetData(int pageSize, int pageNumber)
  {
      var query = yourContext.DataTable
                    .Skip((pageNumber - 1) * pageSize)
                    .Take(pageSize);

      return query.ToList();
  }
}

Будет ли это полезно для вас?

Марк