我想在存储过程的结果中对列进行排序,而不必在存储过程中添加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"];
}
}
}
}
如何添加排序?
答案 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()
一起使用以获取分页数据时,此功能特别有用。