一、 相关知识点
由于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 item in 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、按照数据表的主键进行查找
在按照主键进行查找之前,需要先为数据表指定主键,然后查找是由DataRowCollection的Find()方法去完成的,依然以上面的添加计算列之后数据表为基础进行查找。
如下所示:
Console.WriteLine("-----------按照筛选表达式去搜索-------------");
table.PrimaryKey = newDataColumn[] { id}; //将ID列设为主键
DataRowresultRow = table.Rows.Find(1); //根据主键搜索
Console.WriteLine($"{resultRow["ID"]} {resultRow["Name"]} {resultRow["Height"]} {resultRow["Weight"]} {resultRow[4]}");
注意,设置主键时,使用了table的PrimaryKey属性;
使用Find(object Key)时,参数的为主键列的主键值,可以为int、double、string等等。这里由于主键为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 item in 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” 即先对身高升序排列,然后对体重进行将序排列。
上面代码的返回结果是:
-----------按照筛选表达式去搜索和排序-------------
3 张三 167 62 114.5
2 滕健 172 65 118.5
1 袁菲 162 55 108.5
发现是按照ID进行降序排列的。
3、执行区分大小写的查找
在数据表中,在对比字符串的值的大小时,Select()方法默认是忽略字符的大小写的,即YUANFEI、YuanFei、yuanfei、等都是当成相同的值去对待,如果要对所有搜索实施区分大小写的匹配,可以设置表的CaseSensitive属性。
即
table. CaseSensitive=true;
数据集也有这个属性哦,
Dataset. CaseSensitive=true;