Пейджинг / сортировка моего вида сетки неэффективна?
Вопрос
Я использую веб-сервис, который возвращает список продуктов. Я создал Grid View программно и использовал список в качестве источника данных. Однако я не могу использовать методы Paging / Sorting, так как это вызывает ошибки, так как я не использую элемент управления ObjectSource. Я занимался поиском и сортировкой вручную, но не знаю, эффективно ли я это делаю. Когда пользователь нажимает на новую страницу, я обрабатываю изменение индекса страницы следующим образом:
protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
userProducts = Data.GetProductList();
this.gvProductList.PageIndex = e.NewPageIndex;
this.gvProductList.DataSource = userProducts;
gvProductList.DataBind();
}
Однако база данных всегда вызывается при смене страниц. Есть ли способ сделать это более эффективным, или это нормально для подкачки? То же самое касается сортировки, которая использует веб-сервис для получения продуктов, а затем использует лямбда-выражение для сортировки продуктов по различным столбцам. Каждый раз, когда это происходит, вызывается база данных (чтобы снова получить список продуктов). Я справляюсь с этим неправильно? Я знаю, что могу использовать сеансы и тому подобное для хранения списка, но в одном списке могут быть сотни пользовательских объектов и десятки тысяч пользователей одновременно.
Следует отметить, что веб-сервис предоставляется третьей стороной (и поэтому вызывается их база данных), что означает, что у меня не будет доступа ни к самому SQL Server, ни к каким-либо методам изменения веб-службы. р>
Спасибо за любую помощь.
РЕДАКТИРОВАТЬ: я должен отметить, что список продуктов является корзиной пользователя. Поэтому он уникален для каждого пользователя.
Общий консенсус: Если в корзине мало товаров, текущий метод будет в порядке. Однако, если требуется кэширование, это может быть достигнуто либо с помощью сеансов In Proc, либо путем сохранения сеансов на SQL Server.
Решение
Нет, это неэффективно, поскольку вы возвращаете каждую запись в базовую базу данных (предполагая, что GetProductList () возвращает все записи). Пейджинг GridView означает, что он показывает только количество строк, определенных в PageSize для данного PageIndex, но не влияет на количество записей, фактически возвращаемых из источника данных.
К сожалению, поскольку у вас нет прямого доступа к базе данных, а веб-сервис не предлагает никаких других методов, лучшее, что вы можете сделать, это кэшировать данные . К счастью, asp.net делает кэширование данных довольно простым . Объект Cache похож на Session, за исключением того, что у вас есть только один экземпляр для приложения, а не для пользователя.
Другие советы
Похоже, что вы выбираете все продукты из веб-службы, а затем выполняете сортировку и разбиение по страницам со своей веб-страницы. Это означает, что вы извлекаете из веб-службы больше данных, чем вам нужно за один раз. Предоставляет ли веб-служба возможность передавать аргументы, представляющие требуемую страницу, размер страницы и порядок сортировки? Если нет, возможно, вам следует обсудить возможность добавления этих функций с третьей стороной, которая предоставляет услугу.
Если это невозможно, как часто обновляется список продуктов? Если оно обновляется относительно редко, вы можете использовать кэш ASP.NET для локального хранения результатов вызова веб-службы. Срок действия кэшированного источника данных может быть установлен, например, на почасовой основе. Таким образом, пользователи, просматривающие страницу, увидят достаточно актуальный список продуктов.