Если честно, поскольку вы используете DataTable, вы можете просто отсортировать данные на клиенте.
Динамическая сортировка (на сервере) через SP и т. Д. - это всегда боль; чтобы сделать это на чистом TSQL, вам либо нужен какой-то ужасно неэффективный блок CASE в конце SELECT, либо вам нужно использовать динамический SQL (например, через sp_ExecuteSQL), манипулируя ORDER BY в конечном запросе. Единственный другой вариант (в необработанном TSQL) - это EXEC / INTO, чтобы получить данные в табличную переменную (или временную таблицу), а затем ВЫБРАТЬ из этого с помощью ORDER BY.
Если это опция, LINQ-to-SQL на самом деле делает ОК; он поддерживает запросы (и составление против) UDF - поэтому вместо SP кодируйте запрос в UDF (SP может всегда просто ВЫБРАТЬ из UDF, если вам нужно поддерживать устаревшие вызывающие абоненты). Затем вы можете использовать «упорядочить по» и т. Д. В запросе LINQ:
var qry = from row in ctx.SomeMethod(args)
order by row.Name, row.Key
select row;
(или существуют различные способы добавления динамической сортировки в запрос LINQ - приведенный выше пример является простым)
конечный TSQL будет выглядеть примерно так:
SELECT blah FROM theudf(args) ORDER BY blah
т.е. это сделает это правильно, и сделайте «ЗАКАЗАТЬ» на сервере. Это особенно полезно при использовании с Skip()
и Take()
для получения выгружаемых данных.