Linq to DataSet 之三(创建数据表)

Posted on 2011-01-03 15:26  gmtyt  阅读(1076)  评论(0)    收藏  举报

Linq to DataSet 之三(创建数据表)

(2010-08-25 07:56:19)
标签:

it

分类: 数据库

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()创建的副本,通常用于界面绑定

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3