2012-08-31 41 views
3

我有一個包含多列的數據表(.Net)。其中一列表示RollNo屬於字符串類型,但包含數字數據。例如。 1,2,3,4,5,6,7,8,9,10,11,12,13,14。我試圖使用以下排序:對包含數字數據的字符串類型的數據表中的特定列進行排序

string sql = 
    "Select StudentID, RollNo, AdmissionID,(FirstName + Space(1) + Isnull(MiddleName,'') + Space(1) + Isnull(LastName,'')) as Name," + 
    " PermState as State from Students where ClassId = '" + ddlClass.SelectedValue + "'" + 
    " order by RollNo"; 

DataTable dt = bl.GetDataSet(sql);  
dt.DefaultView.Sort = "RollNo"; 

但是排序後我得到的結果作爲1,10,11,12,13,14,2,3,4,5,6,7,8 ,9.

如何解決?

回答

7

您可以使用Linq-To-DataSet,並投了stringint

DataTable ordered = dt.AsEnumerable() 
         .OrderBy(r => int.Parse(r.Field<String>("RollNo"))) 
         .CopyToDataTable(); 

您需要添加一個引用System.Data.DataSetExtensions.dllusing System.Linq;

請注意,您可以省略CopyToDataTable如果你不這樣做需要它,我已經展示它只是爲了演示如何從IEnumerable<DataRow>獲得DataTable

+0

太棒了!蒂姆,感謝您的支持。但是如果RollNo字段還包含字母數字數據和數字? – Mahbub

+0

這取決於格式。一般來說'Regex'是你的朋友。您可以在Linq中使用任何類型的代碼。 –

+0

你能爲此提供示例代碼嗎? – Mahbub

1

不要這樣做,如果你的數據庫很大。你必須在你的sql語句(這意味着在DB服務器上)進行「字符串到數字」的轉換,這是昂貴的,或者必須將所有的表讀入內存,並且在那裏進行這種排序也是昂貴的。

我會創建一個新的數值字段(列),並將該轉換作爲批處理進行一次。

0
 DataTable dt = GetData(); 
     dt.Columns.Add("RollNo1", typeof(Int32)); 
     foreach (DataRow item in dt.Rows) 
     { 
      item["RollNo1"] = item["RollNo"]; 
     } 
     dt.DefaultView.Sort = "RollNo1"; 
     dt.Columns.Remove("RollNo"); 
     dataGridView1.DataSource = dt; 
相關問題