5.2.4 用查询创建数据表
LINQ to DataSet通过DataTableExtensions类提供的扩展方法CopyToDataTable()将从数据表中获取到的查询结果(类型为IEnumerable<DataRow>)直接复制到一个新的数据表(DataTable)中,从而可以将查询结果绑定到界面控件(DataGridView等),也可以使用一些DataTable特有的特性。
CopyToDataTable()包括3个重载版本,定义如下,其中第1个版本最简单,也最常用。注意,这里的所有类型T都是DataRow类型及其子类。
public static DataTable CopyToDataTable<T>( this IEnumerable<T> source) where T : DataRow
public static void CopyToDataTable<T>(
this IEnumerable<T> source,
DataTable table,
LoadOption options) where T : DataRow
public static void CopyToDataTable<T>(
this IEnumerable<T> source,
DataTable table,
LoadOption options,
FillErrorEventHandler errorHandler) where T : DataRow
其中,table表示目标数据表对象,用来保存数据。options用于指定DataTable的加载属性。errorHandler是一个函数委托,开发人员可以指定自定义的异常处理操作。CopyToDataTable()方法使用下面的过程通过查询创建DataTable复本:
(1)CopyToDataTable()方法克隆源表中的DataTable(实现IQueryable<T>接口的DataTable对象)。IEnumerable源通常来源于LINQ to DataSet表达式或方法查询。
(2)目标DataTable的架构从源表中第一个DataRow对象的列生成,克隆表的名称是源表的名称加上单词“query”。
(3)对于源表中的每一行,将行内容复制到新DataRow对象中,然后将该对象插入到目标DataTale中。
(4)复制完源表中所有DataRow对象后,返回克隆的DataTable。如果源序列不包含任何DataRow对象,则该方法将返回一个空DataTable。
示例代码5-6演示了CopyToDataTable()方法的使用,其中,查询query1查询所有既有成绩,年龄又大于20岁的学生信息,此时query1类型为IEnumerable<DataRow>。然后使用query1的CopyToDataTable()方法创建一个DataTable副本newDt,最后打印出newDt的数据。
示例代码5-6
static void UseCopyToDTSimple( )
{
DataSet ds = BuildDataSet( ); //获取数据集ds
DataTable dtStu = ds.Tables["Students"]; //从数据集ds中获取Students表dtStu
DataTable dtScore = ds.Tables["Scores"]; //从数据集ds中获取Scores表dtScore
var query1 = //查询query1年龄大于20且具有成绩的学生
from stu in dtStu.AsEnumerable( )
from score in dtScore.AsEnumerable( )
where stu.Field<int>("ScoreID") == score.Field<int>("ScoreID")
where (int)stu["Age"] > 20
select stu;
//通过CopyToDataTable()方法创建新的副本
//然后打印该副本的信息
DataTable newDt = query1.CopyToDataTable<DataRow>( );
System.Console.WriteLine("学生列表:");
foreach (var item in newDt.AsEnumerable()) //打印该副本的信息
{
System.Console.WriteLine("姓名:{0}, 性别:{1}, 年龄:{2}",
item["Name"], item["XingBie"], item["Age"]);
}
}
示例代码5-6的输出如下所示,可见query1的副本newDt所包含的数据和query1完全相同,注意本例中的数据源是示例代码5-3所生成。
学生列表:
姓名:王霞, 性别:女, 年龄:21
姓名:赵敏, 性别:女, 年龄:22
技巧:由于本例是控制台应用程序,所以只是简单打印newDt的记录,实际开发中CopyToDataTable()创建的副本,通常用于界面绑定
浙公网安备 33010602011771号