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. kali linux karmetasploit配置

    原理分析:http://www.freebuf.com/articles/77055.html 转官方说明:https://www.offensive-security.com/metasploit- ...

  2. 如何在ubuntu 12.04 中安装经典的 GNOME桌面

    这次介绍的是如何在ubuntu 12.04 中安装经典的 GNOME桌面,默认的 Ubuntu 12.04 默认unity桌面,一些用户不喜欢 Unity 桌面,所以想找回昔日的经典Gnome桌面. ...

  3. CPP,MATLAB实现牛顿插值

    牛顿插值法的原理,在维基百科上不太全面,具体可以参考这篇文章.同样贴出,楼主作为初学者认为好理解的代码. function p=Newton1(x1,y,x2) %p为多项式估计出的插值 syms x ...

  4. iOS开发:集成支付宝(遇见的坑和便捷撸代码)

    开发iOS最重要的就是支付了,天朝之内最常用的就是支付宝了,下面就以自己的经历说明如何集成支付宝+遇见的坑. 首先,集成支付宝最好别使用Cocoapods,很多人都说使用起来很方便,可是我每次只要使用 ...

  5. IOS 作业项目(3) 霓虹灯效果

    先上效果图 #import "CHViewController.h"@interface CHViewController (){    int i;    int j;}@pro ...

  6. Android 常用的常量

    常用的Android常量 1.Activity Action 字符串常量("android.intent.action."+)   描述ALL_APPS               ...

  7. dbd到mongo的序列化问题及稳定性

    最近工作压力有点大,情绪偶然会失控,要好好反省一下自己. 上周本来打算写CSP相关的东西,但是目前做得还不够多,积累的经验不足,就放弃了.中间找到很好的参考资料,一并放在这里.一篇是比较短的论文,可以 ...

  8. Why did Jimmy Wales invest in Quora? Is he afraid that it will take over Wikipedia?

    QUESTION: Why did Jimmy Wales invest in Quora? Is he afraid that it will take over Wikipedia? Answer ...

  9. Kubuntu麦克风音频无声音

    前段时间买了新本,装了双系统,win8和kubuntu 14.04,使用的过程感觉都不错,因为平时玩游戏看视频是用win8,但最近打算在kubuntu上听音乐时,发现音频没有声音,麦克风也没有声音,这 ...

  10. spring学习笔记--quartz和定时任务执行

    前言: 最近要写一个定时任务, 用于同步数据. 以往这种涉及数据库操作的定时脚本, 都会采用python+crontab的方式来实现. 这次画风大转, 决定试试用spring+quartz来实现一下. ...