DataTable的查询与排序

来源:互联网 发布:win10自动下载软件 编辑:程序博客网 时间:2024/05/21 14:09

一、         相关知识点

由于C#Linq查询表达式可以很方便的提供对datatable数据表的查询,排序功能,在这一章,先不讲linq表达式,主要讲一下datatable本身自带的查询与排序功能。

 

1、添加“计算列”

“计算列”就是一个表中的某一列的数据是根据其他列的数据经过计算得到的,那么该列就称之为“计算列”在SQL SERVER数据库中,有着相同的概念,计算列和稀疏字段,它们在意义上是类似的。计算列还有一个更加专业的称谓,称之为“表达式列——Expression DataColumn”,表达式列是通过某一列的Expression属性去完成的,该属性返回的是一个字符串,具体实例如下:

比如有一个原始的数据表table(鉴于篇幅)标的初始化等一些列过程我就没写出来了,如下所示:

-----------原始表中的数据为-------------

ID NameHeight Weight

1 袁菲 162 55

2 滕健 172 65

3 张三 167 62

4 李四 160 57

   现在,我要新建一个列,calculateCol,这个列的值是由第三列和第四列的平均值而来的,我们这样做。

  Console.WriteLine("-----------下面是用“表达式列”为数据表添加一个新的列-------");

   DataColumn calculateCol =newDataColumn("Result",typeof(double)); //创建一个新的列

  calculateCol.Expression = "(Height+Weight)/2"; // 为新列赋值,通过表达式列完成

  table.Columns.Add(calculateCol);              //将新列添加进数据表

   foreach (DataRow itemin table.Rows)         //表的遍历

  {

     Console.WriteLine($"{item[0]} {item[1]} {item[2]} {item[3]} {item[4]}");

  }

   从上面可以看出,表达式列就是将数据表的1列名称当成一个字段然后进行算术运算,这也是计算列的由来,只不过要将其放在双引号里面,表示成字符串的形式,有程序自己去解析表达式列,上面添加计算列之后的结果如下

-----------下面是用表达式列为数据表添加一个新的列-------

1 袁菲 162 55 108.5

2 滕健 172 65 118.5

3 张三 167 62 114.5

4 李四 160 57 108.5

我们发现新的列是由前面两列计算而来的。

 

二、          数据表DataTable的查找和排序

1、按照数据表的主键进行查找

在按照主键进行查找之前,需要先为数据表指定主键,然后查找是由DataRowCollectionFind()方法去完成的,依然以上面的添加计算列之后数据表为基础进行查找。

如下所示:

Console.WriteLine("-----------按照筛选表达式去搜索-------------");

table.PrimaryKey = newDataColumn[] { id};  //将ID列设为主键

DataRowresultRow = table.Rows.Find(1);     //根据主键搜索

Console.WriteLine($"{resultRow["ID"]} {resultRow["Name"]} {resultRow["Height"]} {resultRow["Weight"]} {resultRow[4]}");

 

注意,设置主键时,使用了tablePrimaryKey属性

使用Find(object Key)时,参数的为主键列的主键值,可以为intdoublestring等等。这里由于主键为int,所以搜索主键为1的那一行。该方法仅仅返回所搜索主键的那一行,因为主键是唯一的,返回的结果只是一行

上面程序的执行结果为:

-----------按照筛选表达式去搜索-------------

    1  袁菲 162 55 108.5

 

可以发现,主键为1的那一行就被查找到了。

 

2、 用搜索条件选择需要的一系列行,并且排序

使用表格的Select()方法可以按照搜索条件把满足条件的所有行都查询出来,并排序。该函数是table的,而不是Rows的函数,这是与前面的区别。该函数的几种常见形式如下所示:

publicDataRow[] Select();  

publicDataRow[] Select(string filterExpression);

publicDataRow[] Select(string filterExpression,string sort);

publicDataRow[] Select(string filterExpression,string sort, DataViewRowState recordStates);

我们可以发现,select()函数返回的结果是一些列行的数组。

第一种无参函数,返回的是数据表的所有行

第二种接受一个字符串形式的“筛选表达式——filterExpression,表示筛选的条件,

第三种多了一个参数,也是一个字符串,表示“排序的规则”

第四种这里暂不讨论,有兴趣可以自己查看相关定义。

如下操作:

Console.WriteLine("-----------按照筛选表达式去搜索-------------");

DataRow[]queryRsesult=table.Select("(ID>0)AND(ID<4)","IDDESC");

foreach (var itemin queryRsesult)

{

     Console.WriteLine($"{item[0]} {item[1]} {item[2]} {item[3]} {item[4]}");

 }

在上面代码中,

"(ID>0)AND(ID<4)"这就是“筛选表达式”,即对ID列进行筛选,选出ID>0并且ID<4的那几列,注意(ID>0)(ID<4)的1括号不能少,而AND是“筛选表达式”里面的语法规则,这里暂时不讨论删选表达式的语法规则,有兴趣的可以自己去查看相关的联机文档帮助。

 

而"IDDESC" 就是“排序规则”了,排序规则很简单,

使用“列名称 排序方式”的语法即可,排序方式就两种,一种是升序(ASC,一种是降序(AESC,默认的是升序,故而ASC可以不写。有了排序规则,我们可以定制多种排序方式了,即先对某一列进行升序排序,然后对另一个列进行降序排序。如下

Height,Weight DESC 即先对身高升序排列,然后对体重进行将序排列。

上面代码的返回结果是:

-----------按照筛选表达式去搜索和排序-------------

张三 167  62 114.5

滕健 172  65 118.5

1   袁菲 162 55  108.5

 

发现是按照ID进行降序排列的。

 

3、执行区分大小写的查找

在数据表中,在对比字符串的值的大小时,Select()方法默认是忽略字符的大小写的,即YUANFEI、YuanFei、yuanfei、等都是当成相同的值去对待,如果要对所有搜索实施区分大小写的匹配,可以设置表的CaseSensitive属性

table. CaseSensitive=true;

数据集也有这个属性哦,

Dataset. CaseSensitive=true;

0 0
原创粉丝点击