3

複数の列を持つデータテーブル (.Net) があります。列の 1 つは、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

toを使用Linq-To-DataSetしてキャストできます:stringint

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

への参照を追加する必要がありSystem.Data.DataSetExtensions.dllますusing System.Linq;

CopyToDataTable必要がなければ を省略できることに注意してDataTableくださいIEnumerable<DataRow>

于 2012-08-31T23:52:53.363 に答える
1

DB が大きい場合は実行しないでください。SQLステートメントで(つまりDBサーバー上で)「文字列から数値へ」の変換を行う必要がありますが、これはコストがかかります。または、すべてのテーブルをメモリに読み込んで、そこでこのソートを行う必要があります。これもコストがかかります。

新しい数値フィールド (列) を作成し、この変換をバッチ プロセスとして 1 回行います。

于 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 に答える