LINQ to DataSet 为 DataRow 类提供用于访问列值的扩展方法:Field 方法和 SetField 方法。这些方法使开发人员能够更轻松地访问列值,特别是 null 值。DataSet 使用 Value 来表示 null 值,而 LINQ 使用 .NET Framework 2.0 中引入的可以为 null 的类型支持。使用 DataRow 中预先存在的列访问器需要将返回对象强制转换成相应的类型。如果 DataRow 中的特定字段可以为 null,则必须显示检查 Null 值,因为返回 Value 并隐式地将其强制转换为另一种类型会引发 InvalidCastException。在下面的示例中,如果不使用 IsNull 方法检查 Null 值,则在索引器返回 Value 并试图将其强制转换为String 的情况下会引发异常。

  1. DataSet ds = new DataSet();
  2. ds.Locale = CultureInfo.InvariantCulture;
  3. FillDataSet(ds);
  4.  
  5. DataTable products = ds.Tables["Product"];
  6.  
  7. var query =
  8. from product in products.AsEnumerable()
  9. where !product.IsNull("Color") &&
  10. (string)product["Color"] == "Red"
  11. select new
  12. {
  13. Name = product["Name"],
  14. ProductNumber = product["ProductNumber"],
  15. ListPrice = product["ListPrice"]
  16. };
  17.  
  18. foreach (var product in query)
  19. {
  20. Console.WriteLine("Name: {0}", product.Name);
  21. Console.WriteLine("Product number: {0}", product.ProductNumber);
  22. Console.WriteLine("List price: ${0}", product.ListPrice);
  23. Console.WriteLine("");
  24. }

Field 方法提供对 DataRow 列值的访问,而 SetField 设置 DataRow中的列值。 Field 方法和 SetField 方法都可以处理可以为 null 的类型,因此不必像前面的示例那样检查 Null 值。这两种方法也都是泛型方法,因此不必强制转换返回类型。

下面的示例使用 Field 方法。

  1. // Fill the DataSet.
  2. DataSet ds = new DataSet();
  3. ds.Locale = CultureInfo.InvariantCulture;
  4. FillDataSet(ds);
  5.  
  6. DataTable products = ds.Tables["Product"];
  7.  
  8. var query =
  9. from product in products.AsEnumerable()
  10. where product.Field<string>("Color") == "Red"
  11. select new
  12. {
  13. Name = product.Field<string>("Name"),
  14. ProductNumber = product.Field<string>("ProductNumber"),
  15. ListPrice = product.Field<Decimal>("ListPrice")
  16. };
  17.  
  18. foreach (var product in query)
  19. {
  20. Console.WriteLine("Name: {0}", product.Name);
  21. Console.WriteLine("Product number: {0}", product.ProductNumber);
  22. Console.WriteLine("List price: ${0}", product.ListPrice);
  23. Console.WriteLine("");
  24. }

请注意,Field 方法和 SetField 方法的泛型参数 T 中指定的数据类型必须与基础值的类型相匹配。否则,将引发 InvalidCastException 异常。指定的列名称也必须与 DataSet 中的列名称相匹配,否则将引发 ArgumentException。在这两种情况下,异常都是在执行查询期间的运行时数据枚举时引发的。

SetField 方法本身不执行任何类型转换。但这并不意味着不会发生类型转换。 SetField 方法公开 DataRow 类的 ADO.NET 2.0 行为。类型转换可以由DataRow 对象执行,转换的值随后将保存到 DataRow 对象。

泛型 Field 和 SetField 方法 (LINQ to DataSet)的更多相关文章

  1. LINQ to DataSet,对离线数据的Linq支持、AsEnumeable()

    一.DataTable的扩展方法: 1.DataTable转Linq:AsEnumerable 方法 返回IEnumerable<T>对象,其中泛型参数T是DataRow. 此对象可用在 ...

  2. LINQ To DataSet 示例

    如果在项目遇到这样的问题如:DataTable1和DataTable2需要根据一定的规则进行合并成一个DataTable3. 问题1:DataTable1不是读数据库表的结果,而是合成的数据集,因此无 ...

  3. LINQ(LINQ to DataSet)

    http://www.cnblogs.com/SkySoot/archive/2012/08/21/2649471.html DataTable.Select()方法使用和 SQL 相似的过滤语法从 ...

  4. C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable与Linq相互转换

    LINQ to DataSet需要使用System.Core.dll.System.Data.dll和System.Data.DataSetExtensions.dll,在项目中添加引用System. ...

  5. LINQ系列:LINQ to DataSet的DataTable操作

    LINQ to DataSet需要使用System.Core.dll.System.Data.dll和System.Data.DataSetExtensions.dll,在项目中添加引用System. ...

  6. LINQ系列:LINQ to DataSet的DataView操作

    1. 创建DataView EnumerableRowCollection<DataRow> expr = from p in products.AsEnumerable() orderb ...

  7. Oracle存储过程实现返回多个结果集 在构造函数方法中使用 dataset

    原文 Oracle存储过程实现返回多个结果集 在构造函数方法中使用 dataset DataSet相当你用的数据库: DataTable相当于你的表.一个 DataSet 可以包含多个 DataTab ...

  8. JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

    JAVA反射系列之Field,java.lang.reflect.Field使用获取方法.   转载https://my.oschina.net/u/1407116/blog/209383 摘要 ja ...

  9. SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释

    一.SqlDataAdapter的方法之一Fill (DataSet dataset, String datatable)解释:根据datatable名填充Dataset.myda.Fill(ds, ...

随机推荐

  1. android 删除的警告对话框

    在图形界面之中,对话框也是人机交互的一种重要的形式,程序可以通过对话框对用户进行一些信息的提示,而 用户也可以通过对话框和程序进行一些简单的交互操作. 在Android的开发之中,所有的对话框都是从a ...

  2. [Angular 2] implements OnInit, OnDestory for fetching data from server

    Link: https://angular.io/docs/js/latest/api/core/OnInit-interface.html, https://www.youtube.com/watc ...

  3. zend_db连接mysql(附完整代码)(转)

    在看这些之前请确保你正确加载了PDO扩展. 作法是编辑php.ini手动增加下面这两行(前面要没有分号;):extension=php_pdo.dllextension=php_pdo_mysql.d ...

  4. DOM模型结构——节点类型

  5. Sqlserver2012数据库乱码的解决方法

    Sqlserver2012数据库乱码的解决方法 1.      在创建数据库时,一定要指定数据库的排序规则 2.      输入数据库名称 3.      选中选项,在排序规则中选中Chinese_P ...

  6. freemarker常用的基本命令

    freemarker包括下面几个基本命令 if,else,elseif指令switch,case,default,break指令list,break指令include指令import 指令nopars ...

  7. 206.反转单列表 Reverse Linked List

    Reverse a singly linked list. 使用栈 public class Solution { public ListNode ReverseList(ListNode head) ...

  8. LINQ更新用户

    public Boolean UpdateUser(int id, string userName, string account, string password, string EkeyID,  ...

  9. oralce 恢复Delete删除

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; select * from db_datatable as of timestam ...

  10. n!(n的阶乘)

    我们在这里介绍一些关于n!的性质. 在计数问题中,经常需要用到n!.有必要了解n!在mod p下的一些性质.下面我们假设p是素数,n!=ape(a无法被p整除),并试图求解e和a mod p(把这个东 ...