Сортировка результата хранимой процедуры - PullRequest
3 голосов
/ 27 ноября 2008

Я хочу отсортировать столбец в результате хранимой процедуры, не добавляя в нее порядок Order By. Я не хочу, чтобы данные были отсортированы после выполнения запроса, сортировка должна быть частью запроса, если это возможно. У меня есть следующий код:

public static DataTable RunReport(ReportQuery query)
{
    OffertaDataContext db = new OffertaDataContext();
    Report report = (from r in db.Reports where r.Id == (int)query.ReportId select r).Single(); 
    //???: check security clearance.

    DataSet dataSet = new DataSet();

    /*
    doesn't work, I guess the "Result" table hasn't been created yet;
    if(!string.IsNullOrEmpty(query.SortField))
    {
        dataSet.DefaultViewManager.DataViewSettings["Result"].Sort = query.SortField + " " + (query.SortAscending ? "ASC" : "DESC"); 
    }
    */

    using (SqlConnection conn = new SqlConnection(Config.ConnectionString))
    {
        conn.Open();
        using (SqlCommand exec = conn.CreateCommand())
        {
            using (SqlDataAdapter adapter = new SqlDataAdapter())
            {
                exec.Connection = conn;
                exec.CommandType = CommandType.StoredProcedure;
                exec.CommandText = report.ReportProc;

                adapter.SelectCommand = exec;
                try
                {

                    adapter.Fill(dataSet, query.Skip, query.Take, "Result");
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    conn.Close();
                }
                return dataSet.Tables["Result"];
            }
        }
    }
}

Как добавить сортировку?

Ответы [ 2 ]

2 голосов
/ 27 ноября 2008

Получите таблицу данных, которую вы заполняете в наборе данных («Результат»).

Теперь - нет возможности отсортировать DataTable, кроме как через Query, View или Stored Процедура, которая заполняет это.

Так как вы не хотите делать это в SP, вы можете отсортировать DefaultView DataTable или любой DataView, связанный с DataTable.

Вы можете достичь этого, используя свойство Sort объекта DataView. Это строка, которая указывает столбец (или столбцы) для сортировки и порядок (ASC или DESC).

Пример:

myTable.DefaultView.Sort = "myColumn DESC";

Теперь вы можете использовать DefaultView, чтобы делать все, что вы хотите (привязать его к чему-либо или какому-либо другому)

1 голос
/ 27 ноября 2008

Если честно, поскольку вы используете 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() для получения выгружаемых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...