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之间的记录。

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

linq to dataset绑定datalist:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
          
            selectSql = "select * from Opus order by Oid desc";
            getData(1, selectSql);
        }
    }

static int i;
    private void getData(int pageIndex, string selectSql)
    {

DataTable dt=DBHelper.GetDataSet(selectSql);

var pd = (from p in dt.AsEnumerable()
                  select new {Oid=p.Field<int>("Oid"),Oname=p.Field<string>("Oname"),Oauthor=p.Field<string>("Oauthor"),OcssDesigner=p.Field<string>("OcssDesigner"),OpublisheTime=p.Field<DateTime>("OpublisheTime"),OdemoAddress=p.Field<string>("OdemoAddress"),Ointroduction=p.Field<string>("Ointroduction"),OsavePath=p.Field<string>("OsavePath"), OimagePath=p.Field<string>("OimagePath"), Ouploader=p.Field<string>("Ouploader"),}).Skip((pageIndex - 1) * 6).Take(6).ToList();

DataList1.DataSource = pd;
        DataList1.DataBind();

var pd1 = (from p in dt.AsEnumerable()
                  select new { Oid = p.Field<int>("Oid"), Oname = p.Field<string>("Oname"), Oauthor = p.Field<string>("Oauthor"), OcssDesigner = p.Field<string>("OcssDesigner"), OpublisheTime = p.Field<DateTime>("OpublisheTime"), OdemoAddress = p.Field<string>("OdemoAddress"), Ointroduction = p.Field<string>("Ointroduction"), OsavePath = p.Field<string>("OsavePath"), OimagePath = p.Field<string>("OimagePath"), Ouploader = p.Field<string>("Ouploader"), }).ToList();
        
      
        i =(int)(Math.Ceiling((double)pd1.Count() / 6));

lblCurrent.Text = Convert.ToString(pageIndex);
        lblCount.Text = "/共";
        lblCount.Text += ((int)(Math.Ceiling((double)pd1.Count()/6))).ToString() + "页";

if (pageIndex==1)
        {
            lbtnFirst.Enabled = false;
            lbtnPrev.Enabled = false;
        }
        else
        {
            lbtnFirst.Enabled = true;
            lbtnPrev.Enabled = true;
        }
        if (pageIndex == (int)(Math.Ceiling((double)pd1.Count() / 6)))
        {
            lbtnLast.Enabled = false;
            lbtnNext.Enabled = false;
        }
        else
        {
            
            lbtnLast.Enabled = true;
            lbtnNext.Enabled = true;
        }
    }

protected void lbtnPage_Command(object sender, CommandEventArgs e)
    {
        switch (e.CommandName)
        {
            case "First":
                getData(1, selectSql);
                break;
            case "Next":
                getData(Convert.ToInt32(lblCurrent.Text) + 1, selectSql);
                break;
            case "Prev":
                getData(Convert.ToInt32(lblCurrent.Text) - 1, selectSql);
                break;
            case "Last":
                getData(i, selectSql);
                break;
            default:
                getData(1, selectSql);
                break;
        }
    }

LINQ to DataSet相关推荐

  1. Pro LINQ 之三:LINQ to DataSet

    写在前面 将LINQ to DataSet单独放一篇,是因为随后的LINQ to SQL默认只支持MS SQL Server.只有LINQ to DataSet能在没有相应Data Provider帮 ...

  2. C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable与Linq相互转换

    LINQ to DataSet需要使用System.Core.dll.System.Data.dll和System.Data.DataSetExtensions.dll,在项目中添加引用System. ...

  3. LINQ to DataSet实现复杂数据查询【下】

    Query1-所有学生成绩: 姓名:张三, 数学:80, 语文:75, 英语:78 姓名:王霞, 数学:88, 语文:80, 英语:60 姓名:赵敏, 数学:75, 语文:90, 英语:80 姓名:吴 ...

  4. LINQ To DataSet 几个常用示例

    本文是学习了黄忠成老师的<决战.net -.net framework 3.5>书中 LINQ To DataTable 的相关章节, 并应用到自己的项目中,发现很受用,所以将其中几个示例 ...

  5. 关于Linq to DataSet

    代码   private PagedDataSource BindMethod(PagedDataSource pds, string keyword)         {             O ...

  6. New LINQ CTP!

    FYI, we just released an updated community preview of our LINQ support for both VB and C#, entitled ...

  7. 一步一步学Linq to sql(一):预备知识

    从今天起将推出新手讲堂,首先从linq开始详细讲解.一步一步学Linq to sql(一):预备知识 什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集 ...

  8. 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 1)

    在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 1) 在新的.Net Framework 3.5平台上,Microsoft发布了LINQ(C# 3.0, ...

  9. (转)C# 3.0 LINQ 的演变及其对 C# 设计的影响

    原贴     简单地说,LINQ 是支持以类型安全方式查询数据的一系列语言扩展:它将在代号为"Orcas"的下一个版本 Visual Studio 中发布.待查询数据的形式可以是 ...

最新文章

  1. 程序员和产品经理的恩怨情仇 | 每日趣闻
  2. spring cloud构建互联网分布式微服务云平台-docker部署spring cloud项目
  3. 18.Mysql SQL优化
  4. 多线程测试工具groboutils的使用
  5. 极客无极限 一行HTML5代码引发的创意大爆炸
  6. 大话数据结构顺序表和链表
  7. 中国5G研发试验喜迎“小学课本”
  8. halcon学习之图像分割
  9. python接口上传图片和文件的方法
  10. three.js视频教程2022最新
  11. java 自定义函数_Java自定义函数调用方法解析
  12. Linux桌面文件被隐藏,在Deepin系统中隐藏桌面图标的好办法
  13. 网页无插件播放RTSP流媒体
  14. 腾讯云服务器架设mir2
  15. Flutter报setState() or markNeedsBuild() called during build.错误解决办法
  16. Python数据分析----Python3操作Excel-以豆瓣图书Top250为例
  17. 三星内存编码_内存颗粒版本判断方法和编号解析(三星、美光、海力士)
  18. [禅悟人生]有一种禅心叫认真
  19. 部署CentOS可视化界面GUI-之腾讯云服务器
  20. CAD文件怎么转成低版本?教你两个小妙招

热门文章

  1. 2016上半年中国云存储排行榜:阿里云居榜首
  2. wemall app商城源码Android之支付宝接口公用函数
  3. Mobile and MID opportunities in APAC
  4. Git 原理详解及实用指南
  5. 在Nginx中支持HTTP3.0/QUIC
  6. MiniO纠删码快速入门
  7. Redis面试 - 如何保证缓存与数据库的双写一致性?
  8. HomeBrew 更换为国内源--提高brew命令操作速度
  9. 创建设计模式 - 抽象工厂设计模式
  10. UiPath实践经验总结(二)