Оптимизируйте разбиение на страницы и сортировку с ObjectDataSource, имеющим EnableCaching = true - PullRequest
3 голосов
/ 13 февраля 2010

Я использую резервную копию ODS (ObjectDataSource) с классом Linq-To-SQL для заполнения Gridview на моей странице.

Учитывая производительность - я отключил Viewstate Gridview и включил кэширование в ODS.

Помимо этого, я также оптимизировал метод Search в классе Linq-to-SQL, чтобы использовать методы .skip & .take для извлечения только «страницы с записями».


Теперь проблема в том, что из-за кэширования ODS не может «отсортировать» набор записей самостоятельно. Как подробно описано в этой теме:

Сортировка GridView не работает, когда я включаю кэширование в обычном пейджинге и сортировке

Люди рекомендуют использовать пользовательскую сортировку и реализовывать 'Comparer', но я считаю, что это разрушает мои преимущества в производительности.

http://forums.asp.net/t/1344883.aspx

Я готов сделать отключение БД при сортировке, но как его отделить, когда Кэширование включено?

К вашему сведению, у меня уже есть панель обновления AJAX, в которой у меня есть Gridview (EnableViewstate = false) и ODS (EnableCaching = true). Надеюсь, я на правильном пути ... предложения приветствуются.


Я должен выполнить сортировку на стороне приложения, используя 'Custom-sort' (то есть добавить дополнительные методы, чтобы включить сортировку для общей коллекции объектов). Это решение было неприемлемым, поскольку требовало, чтобы я извлек ВСЕ записи из БД, а затем выполнил сортировку по ним!

Во-первых, я не верю, что приложение может выполнять сортировку лучше / быстрее, чем БД. А во-вторых - это сводит на нет все преимущества в производительности, которые я получаю благодаря оптимизированной разбивке на страницы - я использую методы .skip () и .take () LINQ для извлечения только «страницы» записей.

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

МОЕ РЕШЕНИЕ: Я нажал на событие сортировки в Gridview. Ошибка 'custom-sort' срабатывает, если я разрешаю ODS попытаться выполнить сортировку на кэшированных данных самостоятельно. Вместо этого теперь я выполняю сортировку вручную и отменяю событие сортировки. Для этого - мне просто нужно явно указать параметр 'orderBy' в ODS и установить его в новое выражение сортировки в событии 'Сортировка' Gridview. Это обновит сетку, и в конце я сделаю:

odsOrganization.SelectParameters["orderBy"].DefaultValue = GetSortExpr(e.SortExpression);
...
e.Cancel = true;
  • это говорит ODS отменить сортировку (который я уже выполнил раньше отмена мероприятия - как указано выше). Его как я обманываю ODS и обработки сортировка в фоновом режиме. И спасибо ODS, что он чувствует, что 'SelectParameters ["orderBy"]' имеет изменился и выполняет выбор один раз снова. Я предыдущий род автоматически сохраняется в 'OdsOrganization.SelectParameters [ "OrderBy"]. DefaultValue' который я могу использовать в последующем итераций.

Я все еще тестирую этот, но удивительно, что, просто обновляя параметр DefaultValue, ODS возвращает данные. Это сохраняет кэш до тех пор, пока пользователь не выполнит сортировку (он берет данные из кеша для других операций) и не вернется в БД для сортировки. Надеюсь, у меня все получится!

1 Ответ

1 голос
/ 15 февраля 2010
...