合并后,DataTable排序未正确排序

时间:2019-01-08 03:15:28

标签: c# sorting datatable

我有2个要使用.Merge方法合并的数据表。

2个数据表的列类型为System.Decimal。 但它似乎无法正确排序。首先将对第一个数据表的数据进行排序,然后对第二个数据表中的数据进行排序。

enter image description here

因此,如果您看到上面的图片,它将显示第一个DataTable数据,然后显示第二个DataTable,按开始时间排序。

如果我反向排序,它将以降序对第二个DataTable数据进行排序,然后将出现第一个DataTable。

enter image description here

这是我排序的代码

DataView dv = new DataView(dataTableResult);
dv.Sort = string.Format("{0} {1}", ViewState["sortexp"].ToString(), 
GetSortDirection());
return dv;

ViewState["sortexp"]在这种情况下包含开始时间,而GetSortDirection是“ ASC”或“ DESC”。

我的查询:

select  ....
        to_number(to_char([start_field],'hh24mi')) as start_time, 
        to_number(to_char([end_field], 'hh24mi')) as end_time,
        ...
from    [table]
where   [condition]

另外一个是我从Web服务获取结果并手动填充数据行。

foreach (DTResult dtr in result)
{
    DataRow dr = dtTable2.NewRow();
    ...
    dr["start_time"] = Decimal.Parse(dtr.start_time.Replace(":", ""));
    dr["end_time"] = Decimal.Parse(dtr.end_time.Replace(":", ""));
    ...
    dtTable2.Rows.Add(dr);
}       

和合并代码

dataTableResult.Merge(dtTable1);
dataTableResult.Merge(dtTable2);

dtTable列的定义:

...
dtTable2.Columns.Add("start_time", typeof(decimal));
dtTable2.Columns.Add("end_time", typeof(decimal));
...

如何解决该问题?

1 个答案:

答案 0 :(得分:0)

调试之后,我发现这是由于dataTableResult.Merge(dtTable2);命令在dataTableResult中创建了新列,因此列数增加了一倍。

所以dataTableResult的内容类似于以下内容:

--------------------------------------------------------------------
|Rows              | start_time | end_time | start_time | end_time |
--------------------------------------------------------------------
|0                 | 1200       | 1400     | NULL       | NULL     | --> 1st data table merge
|1                 | 800        | 1000     | 800        | 1000     | --> 2nd data table merge
|2                 | 1400       | 1600     | 1400       | 1600     | --> 2nd data table merge
|3                 | 1600       | 1800     | 1600       | 1800     | --> 2nd data table merge
--------------------------------------------------------------------

列名仅用于说明,因为我看不到实际的列名。因此,一旦第二个数据表被合并,它将创建新的列。第一个数据表的新列包含NULL。并且将重复第二个数据表的列内容(就像两个start_time列将具有相同的值一样)。 不过,这很奇怪。

这就是我解决问题的方法:

dataTableResult中,我将使用大写字母作为列名来定义所有列。由于某种原因,上一个查询使用的是普通字母,这​​会使它加倍。

dataTableResult.Columns.Add("START_TIME", typeof(decimal));
dataTableResult.Columns.Add("END_TIME", typeof(decimal));

然后在数据库查询中,我还将大写字母用作列名别名

select  ....
        to_number(to_char([start_field],'hh24mi')) as START_TIME, 
        to_number(to_char([end_field], 'hh24mi')) as END_TIME,
        ...
from    [table]
where   [condition]    

第二个数据表也是如此

dtTable2.Columns.Add("START_TIME", typeof(decimal));
dtTable2.Columns.Add("END_TIME", typeof(decimal));

通过这种方式,在调用dataTableResult.Merge(dtTable2);时,结果数据表将没有重复的列,并且排序问题已得到解决。