Пейджинг / сортировка моего вида сетки неэффективна? - PullRequest
2 голосов
/ 25 октября 2009

Я использую веб-сервис, который возвращает список продуктов. Я создал 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.

Ответы [ 2 ]

2 голосов
/ 25 октября 2009

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

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

1 голос
/ 25 октября 2009

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

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

...