Реализация пейджера через сервис WCF - PullRequest
12 голосов
/ 12 апреля 2009

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

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

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

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

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

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

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

Не могли бы вы помочь мне выбрать правильный способ реализации этого?

1 Ответ

15 голосов
/ 12 апреля 2009

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

[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();
  }
}

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

Марк

...