对存储过程的结果进行排序

时间:2008-11-27 09:49:39

标签: c# asp.net sorting stored-procedures ado.net

我想在存储过程的结果中对列进行排序,而不必在存储过程中添加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 个答案:

答案 0 :(得分:2)

获取您在dataSet中填充的DataTable(“结果”)。

现在 - 除了通过Query,View或Stored之外,没有办法对DataTable进行排序 填充它的过程。

由于您不想在SP中执行此操作,因此可以对其进行排序 DataTable,或与DataTable关联的任何DataView。

您可以使用DataView的Sort属性来实现它。这是一个字符串,它指定要排序的列(或列)和顺序(ASC或DESC)。

示例:

myTable.DefaultView.Sort = "myColumn DESC";

现在,您可以使用DefaultView执行任何操作(将其绑定到某些内容或其他任何内容)

答案 1 :(得分:1)

老实说,既然您正在使用DataTable,那么您也可以在客户端进行排序。

通过SP等动态排序(在服务器上)总是很痛苦;要在纯TSQL中执行它,您需要在SELECT结束时使用一些非常低效的CASE块,或者您需要使用动态SQL(例如通过sp_ExecuteSQL),在最终查询中操作ORDER BY。唯一的另一个选择(在原始TSQL中)是EXEC / INTO将数据放入表变量(或临时表),然后使用ORDER BY从中进行SELECT。

如果是一个选项,LINQ-to-SQL实际上可以正常运行;它支持查询(和编写)UDF - 因此,而不是SP,在UDF中编码查询(如果您需要支持传统调用者,SP始终只能从UDF中进行SELECT)。然后你可以在LINQ查询中使用“order by”等:

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

即。它会正确,并在服务器上执行“ORDER BY”。与Skip()Take()一起使用以获取分页数据时,此功能特别有用。