一、 设置索引和试图
DataTable的Select方法可以对一个表进行筛选和查询,返回的是数据表中可用行的一个子集,这样本来是很方便的,但是如果数据表比较大,而且需要重复对这个表进行相同的查询,那么资源的使用效率就无法达到最佳,另外Select方法返回的是DataRow数组,而不是一个DataTable,所以一些需要一张完整表才能处理的工具就不能对返回的数据行数组进行处理了。
为了客服上面这些问题,ADO.NET中有DataView类。
1、创建DataView对象
它的构造函数有以下三个版本
public DataView();
publicDataView(DataTable table);
publicDataView(DataTable table, string RowFilter, string Sort, DataViewRowState RowState);
默认情况下是把一个表中的所有数据行都映射到了视图中,但是有时候并不需要,我们只需要我们需要的行,并对他排序。下面这两种构造方法是等价的
(1) DataView view=newDataView(table,”体重=150”,”身高DESC”,DataViewRowState.None);
//直接在构造函数里面就实现删选和排序
(2) DataView view=newDataView(table);
view.RowFilter=”体重=150”;
view.Sort=”身高 DESC”;
//通过设置相关的属性来实现筛选和排序
注意:这里面的删选表达式和排序表达式和前面讲解table.Select方法时是一样的。
最后一个参数是一个DataViewRowState枚举类型。
2、DataView类的三个布尔属性
这三个布尔属性决定了限制通过这个视图能够针对数据行执行的操作。
AllowNew 允许或禁止新建行
AllowEdit 允许或禁止更改行
AllowDelete 允许或禁止删除行
3、DataView的常见使用
(1) 查看视图中有多少行:Count属性 如:
Console.WriteLine($"该视图具有的行数为 {view.Count}");
(2) 查找视图中相应的行:Find()和FindRows()方法,但是在使用这两个方法之前,有一个必须要注意的点,那就是必须在创建DataView对象时指定了相关的排序表达式,即前面的Sort属性,如下所示:
view.Sort = "体重 DESC"; //必须制定排序规则,如果不指定,下面的那条语句会出错
DataRowView[]rowView = view.FindRows(100); //这里的100是体重那一列中的某一个值,即必须指定前面的排序规则才行
foreach (var item in rowView)
{
Console.WriteLine($"{item[0]} {item[1]} {item[2]}");
}
(3) 将视图转化成一个新的表:ToTable()方法如
DataTable t = view.ToTable();
4、 数据表与表视图的补充
事实上,除了为一个表创建自定义的视图对象,即DataView对象以外,每一个表DataTable它本身已经默认了有一个视图的存在,可以通过它的一个属性去获取,即DefaultView属性
如:
DataView v =table.DefaultView;