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。

如何解决?

4

3 回答 3

7

您可以使用Linq-To-DataSet并将其string转换为int

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

您需要添加对System.Data.DataSetExtensions.dll和的引用using System.Linq;

请注意,CopyToDataTable如果您不需要它,您可以省略它,我展示它只是为了演示如何DataTableIEnumerable<DataRow>.

于 2012-08-31T23:52:53.363 回答
1

如果您的数据库很大,请不要这样做。您必须在 sql 语句中进行“字符串到数字”转换(这意味着在数据库服务器上),这很昂贵,或者必须将所有表读入内存并在那里进行这种排序,这也很昂贵。

我将创建一个新的数字字段(列)并将此转换作为批处理进行一次。

于 2012-09-01T00:02:22.770 回答
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;
于 2012-09-01T07:22:25.960 回答