http://www.cnblogs.com/SkySoot/archive/2012/08/21/2649471.html

DataTable.Select()方法使用和 SQL 相似的过滤语法从 DataTable 中提取你关心的记录,虽然 Select()可以很好的工作,但它还是有一些明显的限制。首先,它是基于字符串的,也就是说可能的错误不能在编译的时候发现。其次,它的过滤功能也很有限,它没有提供 LINQ 操作符能够提供的其他特性,如排序、分组以及投影。

使用 LINQ to DataSet 时,本质上和查询对象集合相同的语法。毕竟,DataSet 只是一组 DataTable 的集合,而 DataTable 是一组 DataRow(及其他一些架构信息)的集合。但是,对 DataSet 有一个明显的限制:它没有显示强类型的数据。相反,要由你把字段值强制转换为适当的类型

要让这些应用成为现实,你需要使用 Field<T> 扩展方法。它由 System.Data 命名空间中的 DataRowExtensions 类提供。本质上 Field<T> 扩展所有 DataRow 对象,并让你能够以强类型的方式访问字段:

string value = dataRow.Field<string>("FirstName");

LINQ 针对实现了 IEnumerable<T> 的集合工作。无论是 DataRowCollection 还是 DataTable,都没有实现这个接口,为了弥补这一缺陷,需要使用另一个扩展方法 AsEnumerable(),它为指定的 DataTable 公开 DataRow 对象里的 IEnumerable<T> 集合:

IEnumerable<DataRow> rows = dataTable.AsEnumerable();

下面这个示例把姓以字母 D 开头的员工记录提取为 DataRow 对象:

IEnumerable<DataRow> matches = from employee

    in ds.Tables["Employees"].AsEnumerable()

    where employee.Field<string>("LastName").StartsWith("D")

    select employee;

这个集合并不适合用于数据绑定(它只会显示 DataRow 对象的公共属性而不是字段值的集合)。问题在于绑定 ADO.NET 数据时,必须包含架构(DataTable 能绑定因为它包含了带有列标题以及其他信息的 Columns 集合)。

有两个办法来解决这个问题。

方法一:通过 DataTableExtensions.AsDataView()方法获得过滤行的 DataView:

var matches = from employee in ds.Tables["Employees"].AsEnumerable()

              where employee.Field<string>("LastName").StartsWith("D")

              select employee;

gridEmployees.DataSource = matches.AsDataView();

gridEmployees.DataBind();

LINQ to DataSet 表达式返回 EnumerableRowCollection<T> 类的示例(它实现 IEnumerable 接口)。AsDataView()是一个只可以在 EnumerableRowCollection<T> 对象上工作的扩展方法。因此在前一个示例里,必须使用 var 关键字定义匹配的变量或者把它定义为 EnumerableRowCollection<DataRow>。如果把它声明为 IEnumerable<DataRow>,将不能访问 AsDataView()方法。

方法二:投影

var matches = from employee in ds.Tables["Employees"].AsEnumerable()

              where employee.Field<string>("LastName").StartsWith("D")

              select new

              {

                  First=employee.Field<string>("FirstName"),

                  Last=employee.Field<string>("LastName")

              };

gridEmployees.DataSource = matches;

gridEmployees.DataBind();

两种方法完全等效。 DataView 的方法在非连接的富客户端场景中非常有用,因为它能够在继续追踪 DataSet 变化的情况下操作数据。投影的方法能够把字段的数目减少为只需要关心的那几个。

强类型的 DataSet

强类型的 DataSet 为解除 DataSet 的限制提供了另一个解决方案。因为是强类型,所以不必依赖于 Field<T> 以及 AsEnumerable()方法,这使得表达式具有更好的可读性。

var matches = from employee in ds.Employees

    where employee.LastName.StartsWith("D")

    select new { First = employee.FirstName, Last = employee.LastName };

空值

对于能够以强类型的方式访问字段值,Field<T> 方法起了非常重要的作用。它还有另一个很有用的应用:它把空值(用 DBNull.Value 表示)转换为一个真正的空引用。因此,可以检查值是否为空引用而不是讲其与 DBNull.Value 进行比较,这使 LINQ 表达式更为整洁。

var matches = from employee in ds.Tables["Employees"].AsEnumerable()

              where employee.Field<string>("LastName") != null

              select employee;

LINQ(LINQ to DataSet)的更多相关文章

  1. Rx = Observables(响应) + LINQ(声明式语言) + Schedulers(异步)

    Reactive = Observables(响应)+ Schedulers(异步). Extensions = LINQ(语言集成查询) LINQ: The Operators of Reactiv ...

  2. LINQ(Language Integrated Query)

    LINQ http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html LINQ是.NET Framework 3.5的新特性,其全称 ...

  3. LINQ(语言集成查询)

    LINQ,语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作 ...

  4. LINQ(LINQ to Entities)

    LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...

  5. JSON 的数据转换格式(DataTable或DataSet) -善良公社项目

    这两天在使用JqueryEasyUI框架绑定数据并实现自动分页时,由于框架的限制需要使用Json数据的来传递与获取数据: JSON的全称是JavaScript Object Notation, 是一种 ...

  6. ADO.NET 五(DataAdapter 与 DataSet)

    在执行对表中数据的查询时还能将数据保存到 DataSet 中,但需要借助 DataAdapter 类来实现. 在实际应用中,DataAdapter 与 DataSet 是在查询操作中使用最多的类. 此 ...

  7. Lambda 表达式(C# 编程指南) 微软microsoft官方说明

    Visual Studio 2013 其他版本 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地 ...

  8. 《深入理解Spark:核心思想与源码分析》(第2章)

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  9. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

随机推荐

  1. Ubuntu 14.10 下安装Sublime Text 3,注册码,中文输入法

    1 下载Sublime Text 3,网址http://www.sublimetext.com/3 2 双击deb安装 3 因为需要需要付费,输入下面的注册码,下面的注册码,来自百度,亲测可行 Sub ...

  2. jsunit测试

    var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/ba ...

  3. postgreSQL初步使用总结

    一.安装 postgreSQL安装完成后会默认生成一个名为postgres的用户和一个名为postgres的数据库.可以使用自带的psql.exe工具来登录.其帮助信息如下 连接到本地的postgre ...

  4. BZOJ 4131 并行博弈

    发现必胜态只和(1,1)的状态有关. 无法得知必胜的方法,只知道谁会必胜. #include<iostream> #include<cstdio> #include<cs ...

  5. PHP版本区别

  6. 利用NTP搭建自己的ntp服务

    利用NTP搭建自己的ntp服务 发表于 2013 年 9 月 22 日 作者 admin 对于校园网/企业用户,如果您网内所有计算机都通过互联网同步时间,在速度和精度上都有一定的折扣,并且对互联网出口 ...

  7. jquery模拟淘宝购物车

    今天要实现的一个功能页面就是利用jquery代码模拟一个淘宝网的购物车结算页面 总体页面效果如图: 首先我们要实现的内容的需求有如下几点: 1.在购物车页面中,当选中“全选”复选框时,所有商品前的复选 ...

  8. [数据结构]KMP小结

    KMP小结   By Wine93 2013.9 1.学习链接: http://www.matrix67.com/blog/archives/115 2.个人小结 1.KMP在字符串中匹配中起着巨大作 ...

  9. Magento中,调用静态块的几种方法

    在后台创建一个order_form静态块Block Title :Order FormIdentifier :order_formStatus :EnabledContent :自定义内容 1.如果要 ...

  10. markdown to html

    /************************************************************************* * markdown to html * 说明: ...