5.2
LINQ to DataSet将LINQ和ADO.NET集成,它通过ADO.NET获取数据,然后通过LINQ进行数据查询,从而实现对数据集进行非常复杂查询。本节将介绍如何使用LINQ to DataSet操作数据集DataSet中的数据。
5.2.1
LINQ to DataSet可以简单理解成通过LINQ对DataSet中保存的数据进行查询,它和第7章介绍的LINQ查询并没有太大的区别。LINQ to DataSet的使用通常包含以下步骤:
(1)获取DataSet/DataTable数据源。LINQ to DataSet通过LINQ查询DataSet/DataTable中的数据,所以首先要准备DataSet/DataTable数据源,可以通过ADO.NET技术从数据库获取,可以通过XML技术从XML文件获取,也可以从其他任何形式的数据源获取,甚至可以在内存中直接创建并填充DataSet/DataTable对象。
(2)将DataTable转换成IEnumerable<T>类型。从第7章了解到,LINQ只能在IEnumerable<T>或IQueryable<T>接口对象上执行查询操作,而DataTable并没有实现这两个接口,不能直接查询。在LINQ to DataSet中,通过DataTableExtensions扩展的AsEnumerable()方法从DataTable获取一个等价的IEnumerable<T>对象。
(3)使用LINQ语法编写查询。LINQ to DataSet中查询的编写可以使用查询语法和方法语法,可以对它执行任何IEnumerable<T>允许的查询操作。
(4)使用查询结果。查询结果产生后,就可以使用查询结果(一个IEnumerable<T>对象),比如,用foreach遍历所有元素,用Max()等进行数值计算,将它作为数据源进行二次查询等。
后面几个小节将通过实例详细介绍LINQ to DataSet的具体使用,但是为了更加容易理解,这些示例中的DataSet都通过代码直接在内存中编写,并不从数据库获取。
注意:由于DataSet本身是DataTable的集合,它可以包含一个或多个DataTable及它们之间的关系,LINQ to DataSet实际是对DataTable进行数据查询,并非对DataSet进行查询。
5.2.2
一个DataSet通常包含一个或多个DataTable,同时也包括它们之间的关系集合等,实际上可以把它看成是一个缩影的数据库。LINQ to DataSet也是对一个或多个DataTable进行查询,这些DataTable可以来自单个DataSet,也可以是来自多个DataSet。
在5.2.1节介绍了查询DataTable中元素的主要步骤,在对DataTable进行数据查询时必须使用DataTable类的AsEnumerable()方法,该方法将DataTable转换成一个类型为IEnumerable<DataRow>的可枚举数据集合,它的定义如下:
public static EnumerableRowCollection<DataRow> AsEnumerable(this DataTable source)
因此,从DataTable中获取的元素类型为DataRow,要进一步访问数据表的记录的具体字段数据,就需要使用DataRow的一个扩展泛型方法——Field<T>(),通过它获取DataRow的某字段的数据,它包括6个重载版本,其中最常用的是下面3个。
public static T Field<T>( this DataRow row, DataColumn column )
public static T Field<T>( this DataRow row, int columnIndex )
public static T Field<T>( this DataRow row, string columnName )
其中,参数column表示数据列(DataColumn),表示要返回数据的字段。参数columnIndex表示从0开始的索引列索引。columnName表示要返回数据的字段的名称。通常为了让代码更加通用,作者建议尽量使用字段名称来指定要返回的字段。
在示例代码5-1中,方法BuildOneDTDataSet()在内存中创建一个名为“PeopleDS”的数据集合,它只包含一个名为“PeopleDT”的数据表,数据表包含3个字段:姓名(Name)、性别(XingBie)、年龄(Age)。在方法UseSelect()中,首先通过BuildOneDTDataSet()创建数据集,然后通过DataSet.Tables属性获取名为“PeopleDT”的数据表。在查询query1和query2中通过DataTable.AsEnumerable()方法将DataTable转换成IEnumerable<T>类型的数据集合,并进行查询。query1查询所有元素,而query2只查询姓名字段。
示例代码5-1
//随机创建一个包含数据的DataSet
static DataSet BuildOneDTDataSet( )
{