zoukankan      html  css  js  c++  java
  • Linq To DataSet 之一(基础查询)

    5.2 LINQ to DataSet实现复杂数据查询

    LINQ to DataSet将LINQ和ADO.NET集成,它通过ADO.NET获取数据,然后通过LINQ进行数据查询,从而实现对数据集进行非常复杂查询。本节将介绍如何使用LINQ to DataSet操作数据集DataSet中的数据。

    5.2.1 使用LINQ to DataSet

    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( )

    {

    //可选姓名、性别和年龄,用于创建学生数据到数据表中

    string[] nameSet = {"王霞","张三","李四","李花","王五", "陆六","夏七","吴八" };

    string[] xbSet = { "女", "男", "男", "女", "男", "男", "男", "男" };

    int[] ageSet = {18, 20, 21, 22, 19, 20, 25, 24};

    DataSet ds = new DataSet("PeopleDS"); //创建名为PeopleDS的DataSet对象

    DataTable dt = new DataTable("PeopleDT"); //创建名为PeopleDT的DataTable对象

    ds.Tables.Add(dt); //将数据表dt添加到数据集ds中

    //创建DataTable的列(字段)信息,包括3个字段:

    //姓名:Name,string类型

    //性别:XingBie,string类型

    //年龄:Age,int类型

    dt.Columns.AddRange(

    new DataColumn[]

    {

    new DataColumn("Name", Type.GetType("System.String")),

    new DataColumn("XingBie", Type.GetType("System.String")),

    new DataColumn("Age", Type.GetType("System.Int32")),

    });

    //利用前面定义的可选姓名nameSet、年龄ageSet、性别xbSet创建多个学生信息

    for (int i = 0; i < nameSet.Length; i++)

    {

    //根据当前编号,自动新建数据表中的一行,并产生一行数据

    //然后通过DataTable.Rows.Add()将这一行添加到数据表dt中

    DataRow row = dt.NewRow( );

    row["Name"] = nameSet[i];

    row["Age"] = ageSet[i];

    row["XingBie"] = xbSet[i];

    dt.Rows.Add(row); //添加到数据表dt中

    }

    return ds; //返回DataSet

    }

    static void UseSelect( )

    {

    DataSet ds = BuildOneDTDataSet( ); //获取数据集ds

    DataTable dt = ds.Tables["PeopleDT"]; //从数据集ds中获取名为“PeopleDT”的数据表dt

    //查询query1表示查询DataTable中所有记录,演示AsEnumerable()的使用

    var query1 =

    from pl in dt.AsEnumerable( )

    select pl;

    System.Console.WriteLine("Query1:");

    foreach (var item in query1) //打印查询query1的结果

    {

    //演示Field<T>方法的使用

    System.Console.WriteLine("姓名:{0},性别:{1},年龄:{2}",

    item.Field<string>("Name"), item.Field<string>("XingBie"), item.Field<int("Age"));

    }

    //查询query2表示查询DataTable中所有人的姓名,演示AsEnumerable()和Field<T>的使用

    var query2 =

    from pl in dt.AsEnumerable( )

    select pl.Field<string>("Name");

    System.Console.WriteLine("Query2:"); //打印查询query1的结果

    foreach (var item in query2)

    {

    System.Console.Write("{0} ", item);

    }

    System.Console.WriteLine( );

    }

    示例代码5-1的输出如下所示,其中,查询query1的结果为表中所有完整记录,包括姓名、性别和年龄。查询query2的结果只包括表中“Name”字段的集合。

    Query1:

    姓名:王霞,性别:女,年龄:18

    姓名:张三,性别:男,年龄:20

    姓名:李四,性别:男,年龄:21

    姓名:李花,性别:女,年龄:22

    姓名:王五,性别:男,年龄:19

    姓名:陆六,性别:男,年龄:20

    姓名:夏七,性别:男,年龄:25

    姓名:吴八,性别:男,年龄:24

    Query2:

    王霞 张三 李四 李花 王五 陆六 夏七 吴八

    除了使用select语句外,还可以对DataTable记录进行where过滤、orderby排序、groupby分组等操作。如示例代码5-2所示,其中,查询query3和query4中同时使用orderby和where子句,同时进行过滤和排序两个操作。query3查询所有年龄大于22岁的记录,并按照年龄从低到高排序。query4查询所有年龄在20~25之间的记录,并按照年龄从高到低排序。

    示例代码5-2

    static void UseOrderByWhere( )

    {

    DataSet ds = BuildOneDTDataSet( ); //获取数据集ds

    DataTable dt = ds.Tables["PeopleDT"]; //从数据集ds中获取名为“PeopleDT”的数据表dt

    //查询query3查询数据表中所有年龄大于22的人,并且按照年龄从低到高排序

    var query3 =

    from pl in dt.AsEnumerable( )

    orderby pl.Field<int>("Age")

    where pl.Field<int>("Age") > 22

    select pl;

    System.Console.WriteLine("Query3:");

    foreach (var item in query1) //打印查询query3的结果

    {

    System.Console.WriteLine("姓名:{0},性别:{1},年龄:{2}",

    item.Field<string>("Name"), item.Field<string>("XingBie"), item.Field<int>("Age"));

    }

    //查询query4查询数据表中所有年龄大于20小于25的人,并且按照年龄从高到低排序

    var query4 =

    from pl in dt.AsEnumerable( )

    orderby pl.Field<int>("Age") descending

    where pl.Field<int>("Age") > 20

    where pl.Field<int>("Age") < 25

    select pl;

    System.Console.WriteLine("Query4:");

    foreach (var item in query2) //打印查询query4的结果

    {

    System.Console.WriteLine("姓名:{0},性别:{1},年龄:{2}",

    item.Field<string>("Name"), item.Field<string>("XingBie"), item.Field<int>("Age"));

    }

    }

    示例代码5-2的输出如下所示,其中,query3输出是年龄大于22岁的记录,query4输出是年龄在20~25之间的记录。

    Query3:

    姓名:吴八,性别:男,年龄:24

    姓名:夏七,性别:男,年龄:25

    Query4:

    姓名:吴八,性别:男,年龄:24

    姓名:李花,性别:女,年龄:22

    姓名:李四,性别:男,年龄:21

    技巧:LINQ to DataSet查询DataTable的数据可以简单分成两个部分,首先是将DataTable转换成IEnumerable<T>数据集合,然后就是对IEnumerable<T>进行操作,这一步可以完全应用第7章介绍的所有LINQ查询操作。

    为了您的安全,请只打开来源可靠的网址

    打开网站 取消

    来自: http://hi.baidu.com/2wixiao/blog/item/5e69ff0593b4b4c27b8947c6.html

  • 相关阅读:
    Atitit 数据库view视图使用推荐规范与最佳实践与方法
    Atitit mybatis快速开发 的sql api接口
    一个数据包经过路由器和交换机各会发生什么变化
    c preprocessor
    A database of opensource HTTP proxies written in python.
    google chrome os下载
    一道笔试题多字串查找
    一个老题:将正整数n分为若干num个不同的正整数之和
    web dev framework
    memory leakage
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/2436478.html
Copyright © 2011-2022 走看看