2008-11-27 90 views
3

我想在存儲過程的結果中對列進行排序,而不必在存儲過程中添加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"]; 
        } 
       } 
      } 
     } 

如何添加排序?

謝謝! /Niels

+0

你說「我想排序結果中的一列的存儲過程,而不必在存儲過程中添加Order By子句「,然後」如果可能,排序應該是查詢的一部分「! – 2008-11-27 10:05:45

回答

2

獲取您在dataSet中填充的DataTable(「Result」)。

現在 - 除了通過查詢,查看或存儲以外,沒有辦法對DataTable進行排序 填充它的過程。

由於您不想在SP中執行此操作,因此您可以對 DataTable或任何與DataTable關聯的DataView的DefaultView進行排序。

您可以使用DataView的Sort屬性來實現它。這是一個字符串,它指定要排序的列(或多列)以及順序(ASC或DESC)。

例子:

myTable.DefaultView.Sort = "myColumn DESC"; 

您現在可以使用默認視圖做任何你想要的(將其綁定到的東西或其他)

1

說實話,既然您使用的是DataTable,那麼您也可以在客戶端進行排序。

通過SP等進行動態排序(在服務器上)總是很痛苦;要在純粹的TSQL中完成它,你需要在SELECT結尾處使用一些非常低效的CASE塊,或者需要使用動態SQL(例如通過sp_ExecuteSQL),在最終查詢中操作ORDER BY。唯一的其他選項(在原始TSQL中)是EXEC/INTO將數據存入表變量(或臨時表),然後用ORDER BY從這裏選擇。

如果它是一個選項,LINQ-to-SQL實際上在此確實可以;它支持對UDF進行查詢(而不是構成)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 

即它會得到它的權利,並在服務器上執行「ORDER BY」。當與Skip()Take()一起使用來獲得分頁數據時,這是特別有用的。