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,语言集 ...
随机推荐
- unity3d基础01
Unity3d 五大视图: 1 Scene:存放hierarchy中创建的游戏对象,但实际只能看到一部分 *Scene浏览: ①右键进入“飞行模式”,方便查看整个场景 ②选中摄像机,按ALT进入浏览的 ...
- oracle 10gwindow7安装添加内容
F:\软件\database\stage\prereq\db\refhost.xml <!--Microsoft Windows 7 .Windows 8--> <OPERATING ...
- BZOJ 4562 食物链
我们需要拓扑一下. #include<iostream> #include<cstring> #include<cstdio> #include<algori ...
- __set()与__get() 魔术方法
在面向对象编程的过程中,对于类当中的各个成员变量,都有不同的访问属性,比如公有的(public)属性,在类内部和类外部都可直接调用:而私有的(private)和受保护的(protected),在类外不 ...
- # 20145210 《Java程序设计》第04周学习总结
教材学习内容总结 第六章 继承 •继承:继承基本上就是避免多个类间重复定义共同行为. 我理解的就是:在编写程序的过程中可能会出现部分代码重复的现象,把重复的部分单独定义为一类(父类),在其他代码中(子 ...
- JQuery操作Table元素
使用Jquery操作Table中的tr向上或向下移动,以及全选和反选操作. 点击Table Head中的复选框,全选或反选表格中所有的复选框; 选中复选框,点击Up 按钮, tr上移;点击 Down ...
- I.MX6 mfgtool2-android-mx6q-sabresd-emmc.vbs hacking
/******************************************************************** * I.MX6 mfgtool2-android-mx6q- ...
- 如何使用SnpEff 对SNP结果进行分析
SnpEff is a variant annotation and effect prediction tool. It annotates and predicts the effects of ...
- 230. Kth Smallest Element in a BST
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- 274. H-Index
Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...