- Мой управления GridView подкачки/сортировка неэффективна?


Я использую веб-сервис, который возвращает список продуктов. Я создал сеточное представление программно и использовал список в качестве источника данных. Однако я не могу использовать методы подкачки/сортировки, поскольку это вызывает ошибки, так как я не использую элемент управления ObjectSource. Я обрабатывал страницы и сортировку вручную, но я не знаю, насколько эффективно я это делаю. Когда пользователь нажимает на новую страницу, я обрабатываю изменение индекса страницы следующим образом:

protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    userProducts = Data.GetProductList();

    this.gvProductList.PageIndex = e.NewPageIndex;
    this.gvProductList.DataSource = userProducts;
    gvProductList.DataBind();
}

Однако база данных всегда вызывается, когда я изменяю страницы. Есть ли способ сделать это более эффективным,или это нормально для подкачки? То же самое касается сортировки, которая использует веб-сервис для получения продуктов, а затем использует лямбда-выражение для сортировки продуктов по различным столбцам. Каждый раз, когда это происходит, вызывается база данных (для того, чтобы снова получить список продуктов). Я что, неправильно к этому отношусь? Я знаю, что могу использовать сеансы и тому подобное для хранения списка, но в каждом списке могут быть сотни пользовательских объектов и десятки тысяч пользователей. в любой момент.

Я должен отметить, что веб-служба предоставляется третьей стороной (и поэтому вызывается их база данных), что означает, что у меня не будет доступа к самому SQL-серверу и никаким методам изменения веб-службы.

Спасибо за любую помощь.

EDIT: я должен упомянуть, что список продуктов - это корзина пользователя. Поэтому он уникален для каждого пользователя.

Общее мнение: Если корзина не содержит много товаров, текущий метод будет окей. Однако, если требуется кэширование, это может быть достигнуто либо использованием сеансов in Proc, либо сохранением сеансов на SQL-сервере.

2 2

2 ответа:

Нет, это не эффективно, так как вы возвращаете каждую запись в базовую базу данных (предполагая, что GetProductList() возвращает все записи). Подкачка GridView просто означает, что она показывает только количество строк, определенных в PageSize для данного PageIndex , но не влияет на количество записей, фактически возвращаемых из источника данных.

К сожалению, поскольку у вас нет прямого доступа к базе данных, а веб-сервис не предлагает никаких других методов, то лучшее, что вы можете сделать, это: вероятно, сделать это кэшировать данные . К счастью asp.net делает кэширование данных довольно простым . Объект кэша очень похож на Session, за исключением того, что у вас есть только один экземпляр на приложение, а не на пользователя.

Похоже, что вы извлекаете все продукты из веб-службы, а затем выполняете сортировку и подкачку из своей веб-страницы. Это означает, что вы извлекаете из веб-службы больше данных, чем вам нужно в любой момент времени. Предоставляет ли веб-служба возможность передавать аргументы, представляющие требуемую страницу, размер страницы и порядок сортировки? Если нет, возможно, вам следует обсудить возможность добавления этих функций с третьей стороной, предоставляющей услугу.

Если это возможно ли, как часто обновляется список продуктов? Если он обновляется относительно редко, вы можете использовать ASP.NET кэш для локального хранения результатов вызова веб-службы. Срок действия кэшированного источника данных может истекать, скажем, ежечасно. Таким образом, пользователи, просматривающие страницу, увидят достаточно актуальный список продуктов.