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;

相关文章推荐

Linq to DataSet

  • 2010-11-19 16:30
  • 947KB
  • 下载

Using LINQ to manipulate data in DataSet/DataTable

Using LINQ to manipulate data in DataSet/DataTable Have you tried a micro ORM for your data acc...

Linq to DataSet

Linq to  DataSet将Linq与ADO.NET集成,通过ADO.NET获取数据,然后通过Linq进行查询,从而实现对数据的复杂查询,Linq to DataSet可以理解为通过Linq对D...

LINQ to DataSet实现复杂数据查询

5.2 LINQ to DataSet实现复杂数据查询LINQ to DataSet将 LINQ和 ADO.NET集成,它通过 ADO.NET获取数据,然后通过 LINQ进行数据查询,从而实现...

LINQ to DataSet实现复杂数据查询

5.2 LINQ to DataSet实现复杂数据查询LINQ to DataSet将LINQ和ADO.NET集成,它通过ADO.NET获取数据,然后通过LINQ进行数据查询,从而实现对数据集进行非常...

LINQ to DataSet

LINQ to DataSet将LINQ和ADO.NET集成,它通过ADO.NET获取数据,然后通过LINQ进行数据查询,从而实现对数据集进行非常复杂查询。本节将介绍如何使用LINQ to DataS...

Linq to DataSet 学习笔记一

Linq to DataSet Linq to  DataSet将Linq与ADO.NET集成,通过ADO.NET获取数据,然后通过Linq进行查询,从而实现对数据的复杂查询,Linq to Dat...
  • jvbss
  • jvbss
  • 2012-03-31 10:55
  • 419

Linq to DataSet

Linq to  DataSet将Linq与ADO.NET集成,通过ADO.NET获取数据,然后通过Linq进行查询,从而实现对数据的复杂查询,Linq to DataSet可以理解为通过Linq对D...

LINQ TO DataSet Overview

LINQ TO DataSet Overview 相对而言,LINQ TO DataSet是LINQ技术中最小的一块,虽然是DB中抽取出来的一个离线的操作模型,但毕竟对象也是个内存里面的object而...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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