对DataSet中存在DataRelation的DataTable中的记录进行排序
在ADO.NET中,没有为DataTable对象提供排序方法,因为在大多数场景中,DataTable转换为DataView是可以满足需求的,同时DataView提供了Sort属性,直接设置排序字符串即可达到排序的目的。
今天遇到特殊的情况了,用过策略模式的人也许经常遇到类似的情形,通过一个标记了Flag属性的枚举类型,采用不同的策略,将得到的结果要进行汇总,然后返回给调用方。我这个最终的结果集要是只有一个表也就算了,上面提供的方式就能完全满足,但是这次返回的有两个表,有两个表也就算了,要是不同表提供给不同的视图也能用DataView解决。主要是这两个表之间还有关联,提供给同一个视图调用。
刚开始我总是想找到一种简便的方式来实现我想要的结果,大家都知道,有些程序员总是有一种不断追求完美的心态,我就属于这类的。起初我想法是只更改主表记录,先将数据Copy一份出来,然后清空主表记录,对Copy出来的数据进行排序,然后依次插入到空的主表中,最终运行程序告诉我这个想法也就只允许我想想而已。ADO.NET中的数据也是有完整性约束的,存在DataRelation的表是不能随便删除记录的,需要将子表中相关的数据一起删除
最后实现代码片断如下:
DataSet ds = GerneratedDataSetSchema();//得到DataSet结构及关系
... ...//通过各种策略填充数据集
DataTable tempMain = ds.Tables["Main"].Clone();
DataRow[] mainRows = ds.Tables["Main"].Select(null,"Fee DESC") //根据Fee列降序排列
DataSet sortedDs = ds.Clone();
foreach(DataRow mainRow in mainRows)
{
sortedDs.Tables["Main"].ImportRow(mainRow);
}
foreach(DataRow detailRow in ds.Tables["Detail"].Rows)
{
sortedDs.Tables["Detail"].ImportRow(detailRow);
}
... ...//通过各种策略填充数据集
DataTable tempMain = ds.Tables["Main"].Clone();
DataRow[] mainRows = ds.Tables["Main"].Select(null,"Fee DESC") //根据Fee列降序排列
DataSet sortedDs = ds.Clone();
foreach(DataRow mainRow in mainRows)
{
sortedDs.Tables["Main"].ImportRow(mainRow);
}
foreach(DataRow detailRow in ds.Tables["Detail"].Rows)
{
sortedDs.Tables["Detail"].ImportRow(detailRow);
}
return sortedDs; //得到主记录表排好序的集合
没有什么技术难点,就是将主表排好序的数据和字表的数据都重新填充进一个新的数据集中,然后返回。
实践证明,程序是苛刻的,很多时候容不得你走捷径,有时最好你想都不要想。
用发现的眼光来看这个互联网,总有我们立脚的地方!——北纬28.33