Я только что понял, что этот вопрос все еще висит здесь, поэтому вот мой вывод на эту тему:
Я все еще думаю, что полезно встроить стандартный элемент управления GridView в страницу ASP.Net. Я все еще думаю, что неразумно обрабатывать каждое событие сортировки в выделенном фрагменте кода для страницы, поскольку это создает настоящий кошмар для обслуживания и отбрасывает ваш код взаимодействия с данными и бизнес-логики слишком близко к «представлению» в терминах MVC. .
Что я не знал, так это то, насколько тесно интегрированы GridView с различными элементами управления DataSource. Я знал, что при правильных обстоятельствах GridView при подключении к SqlDataSource будет выполнять различные операции CRUD непосредственно с базой данных, применяя свои собственные методы сортировки и разбиения на страницы, но это плохо переводилось на использование ObjectDataSource с бизнес-объектом - или так Я думал.
Оказывается, что в элементе управления ObjectDataSource есть три важных свойства, которые позволяют ему динамически предоставлять метод бизнес-объекта с параметрами сортировки и подкачки.
Это следующие свойства: SelectCountMethod, SortParameterName, StartRowIndexParameterName и MaximumRowsParameterName. Эти свойства в сочетании с требуемым флагом EnablePaging изменяют ожидаемую подпись вашего метода «Выбрать» и запускаются автоматически, используя ваш метод SelectCount, чтобы получить общее возможное количество возвращаемых записей, используя размер страницы вашего GridView и текущее состояние, чтобы определить, с чего начать. ваш набор результатов и количество элементов для выбора после этой начальной точки, и он начинает отправлять выражение сортировки в стиле SQL вместе со всеми вызовами вашего метода Select.
В целом, это был большой шаг вперед, но если вы используете пользовательские коллекции классов POCO или выполняете запросы к объектному контексту LinqToSql или EF, вам все равно придется перевести параметры StartRowIndex и MaximumRow в некоторую форму комбинацию Skip (). Take () (которая довольно проста и очевидна) и переводит выражение Sort в какой-либо тип запроса к контексту вашего объекта или коллекции в памяти.
Я не буду вдаваться во все подробности, но в основном решение состоит в том, чтобы использовать возможности и отражение dynamic-Linq для определения выражения запроса для вашей коллекции в памяти, используя только строку сортировки.
Строка сортировки будет содержать имя поля и направление сортировки (только если по убыванию) в типичном формате «FieldName DESC». Анализируя эту строку, вы можете использовать отражение для вашего конкретного типа, чтобы создать выражение, используя соответствующее имя свойства из строки сортировки.
Основным преимуществом здесь является то, что с помощью всего лишь нескольких настроек метода select и использования специального расширения Linq для обработки преобразования строки сортировки в лямбда-выражение вы можете заняться обычным делом, подключив GridViews к бизнесу. логика со встроенной сортировкой и функциональностью подкачки.
Поскольку это было упомянуто в первоначальном вопросе, я отмечу, что это решение приведет к попаданию в базу данных практически при каждой загрузке страницы, но в конечном итоге объем возвращаемых данных должен быть намного меньше и более целенаправленным.