LINQ(LINQ to DataSet)
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)的更多相关文章
- Rx = Observables(响应) + LINQ(声明式语言) + Schedulers(异步)
Reactive = Observables(响应)+ Schedulers(异步). Extensions = LINQ(语言集成查询) LINQ: The Operators of Reactiv ...
- LINQ(Language Integrated Query)
LINQ http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html LINQ是.NET Framework 3.5的新特性,其全称 ...
- LINQ(语言集成查询)
LINQ,语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作 ...
- LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...
- JSON 的数据转换格式(DataTable或DataSet) -善良公社项目
这两天在使用JqueryEasyUI框架绑定数据并实现自动分页时,由于框架的限制需要使用Json数据的来传递与获取数据: JSON的全称是JavaScript Object Notation, 是一种 ...
- ADO.NET 五(DataAdapter 与 DataSet)
在执行对表中数据的查询时还能将数据保存到 DataSet 中,但需要借助 DataAdapter 类来实现. 在实际应用中,DataAdapter 与 DataSet 是在查询操作中使用最多的类. 此 ...
- Lambda 表达式(C# 编程指南) 微软microsoft官方说明
Visual Studio 2013 其他版本 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地 ...
- 《深入理解Spark:核心思想与源码分析》(第2章)
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
随机推荐
- Android 对 properties文件的读写操作
-. 放在res中的properties文件的读取,例如对放在assets目录中的setting.properties的读取:PS:之所以这里只是有读取操作,而没有写的操作,是因为我发现不能对res下 ...
- hdu 2081
PS:...找到好多水题.... #include "stdio.h" int main(){ ]; int i,j,n,N; scanf("%d",& ...
- 用C++,调用浏览器打开一个网页
http://blog.csdn.net/heaven13483/article/details/9369029
- eclipse中导入一个android工程有The import android cannot be resolved错误怎么办
解决方法: 右键工程→Bulid Path→Configure Build Path... 选择Android,如图,在Project Build Target里面勾选相应的SDK即可 右键工程,pr ...
- 解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann't download..
insert Vodafone sim card,open the mms read report,when receive the read report,cann't download the m ...
- Cisco ASA 5505 Routing Between Two (Internal) VLANS
Referenced:http://www.petenetlive.com/KB/Article/0000869 Problem I had to set this up for a client t ...
- 破解 Splish
系统 : Windows xp 程序 : Splish 程序下载地址 :http://pan.baidu.com/s/1o6SA25k 要求 : 注册机编写 & 找出硬编码 使用工具 : OD ...
- Oracle常用SQL语句
--2.查看表结构 desc wx_monitor_excption; --3.从表中查询数据 select * from wx_monitor_excption; --7.双引号保持原来的格式 se ...
- 初步探讨WPF的ListView控件(涉及模板、查找子控件)
本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmln ...
- 《深入浅出Node.js》第2章 模块机制
@by Ruth92(转载请注明出处) 第2章 模块机制 JavaScript 先天缺乏的功能:模块. 一.CommonJS 规范: JavaScript 规范的缺陷:1)没有模块系统:2)标准库较少 ...