Linq To DataSet

转载 2016年08月31日 10:15:32

      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;

零基础学软件之ASP.NET 第九季 LINQ技术

主讲内容: 第一讲 LINQ技术概述 第二讲 from子句 第三讲 where子句 第四讲 select子句 第五讲 orderby子句 第六讲 建立LINQ数据源 第七讲 查询数据库中的数据 第八讲 向数据库中添加数据 第九讲 修改数据库中的数据 第十讲 删除数据库中的数据
  • 2017年02月18日 12:04

linq学习 Linq to DataSet

Linq to DataSet Linq to  DataSet将Linq与ADO.NET集成,通过ADO.NET获取数据,然后通过Linq进行查询,从而实现对数据的复杂查询,Linq to...
  • Draling
  • Draling
  • 2012-04-22 10:20:03
  • 3019

LINQ系列:LINQ to DataSet的DataTable操作

LINQ,语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作...
  • younghaiqing
  • younghaiqing
  • 2017-03-27 15:36:11
  • 1313

Dataset用法实践之三 dataset与LINQ使用

Dataset用法实践之三 dataset与LINQ使用csharpsamples中有各种例子,是最好的教材。http://www.yesky.com/96/1924596_2.shtml  ADO....
  • zhongchengli
  • zhongchengli
  • 2010-07-05 14:55:00
  • 4252

怎样用C# LINQ将DataSet转换成List?

需要调用DataTable.AsEnumerable()方法得到一个IEnumerable类型的集合。用返回的IEnumerable对象,我们调用ToList()函数来转换成List对象。 代码如下:...
  • cjh200102
  • cjh200102
  • 2011-06-07 09:31:00
  • 2282

通过linq汇总查询dataset 中的数据

var result = from c in ds.Tables["pay"].AsEnumerable()                          group c by c.Field ...
  • tonysong111
  • tonysong111
  • 2014-11-26 10:10:20
  • 288

Linq强大的查询功能,以及DataSet中多表之间交叉查询,字段过滤,筛选等

Linq强大查询功能 using System; ...
  • smartsmile2012
  • smartsmile2012
  • 2012-12-04 10:29:21
  • 5685

vs2008语言集成查询(LINQ)之LINQ TO DataSet

  • 2009年08月12日 17:52
  • 11.03MB
  • 下载

Linq to DataSet查询

笔者项目中遇到从DataSet中按某条件查询单个数据问题,DataSet后是Sql语句从数据库中查询取得一个集合。查询语句就不写了。其中表结构如下: CREATE TABLE [dbo].[tb_re...
  • mzxjhx
  • mzxjhx
  • 2017-02-27 15:57:10
  • 114

LINQ To DataSet:联合查询

LINQ To DataSet 联合查询
  • lee576
  • lee576
  • 2011-04-26 15:22:00
  • 1970
收藏助手
不良信息举报
您举报文章:Linq To DataSet
举报原因:
原因补充:

(最多只允许输入30个字)