zoukankan      html  css  js  c++  java
  • LINQ(LINQ to DataSet)

           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;
     
    本文转载:http://www.cnblogs.com/SkySoot/archive/2012/08/21/2649471.html
     
    很好的一个例子,告诉你linq 无法直接操作数据集dataset 如要操作要先转换成DataTable 并实现扩展方法AsEnumerable()才可以,还要注意下返回对象集合不能直接绑定GridView,另外有兴趣的同学可以看看 IEnumerable,IQueryable,Ilist的区别
  • 相关阅读:
    打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
    基于 Windows Server 2008 的计算机对 Microsoft Dynamics CRM 4.0 的支持
    Microsoft Dynamics CRM 4.0 如何添加自定义按钮
    Microsoft Dynamics CRM 4.0 Plugin 取值,赋值,查询
    C# 中的 enum(枚举) 类型使用例子
    vue事件的绑定
    表单验证2
    node中模块
    node模块的引入
    node中的读文件
  • 原文地址:https://www.cnblogs.com/0515offer/p/4083571.html
Copyright © 2011-2022 走看看