使用LINQ访问数据集
1. LINQ to DataSet 概述
1.1. 数据集(DataSet)
• DataSet 是更为广泛使用的 ADO.NET 组件之一,它可以显式缓存不同数据源中的数据。
• 在表示层上,DataSet 与 GUI 控件紧密集成,以进行数据绑定。
• 在中间层上,它提供保留数据关系形状的缓存并包括快速简单查询和层次结构导航
服务,从而可以减少对数据库的请求数。
1.2. 查询数据集
• DataSet 虽然具有突出的优点,但其查询功能也存在限制。
• Select 方法可用于筛选和排序,GetChildRows 和 GetParentRow 方法可用于层次结构导航。
• 但对于更复杂的情况,开发人员必须编写自定义查询。 这会使应用程序性能低下并且难以维护。
1.3. 使用LINQ to DataSet
• 使用 LINQ to DataSet 可以更快更容易地查询在DataSet 对象中缓存的数据。
• 这些查询用编程语言本身表示,而不表示为嵌入在应用程序代码中的字符串。
• LINQ to DataSet 可使Visual Studio 开发人员的工作效率更高,因为 Visual Studio IDE 提供编译
时语法检查、静态类型化和对LINQ 的智能感知的支持。
• LINQ to DataSet 也可用于查询从一个或多个数据源合并的数据。 这可以使许多需要灵活表示和处
理数据的方案能够实现。
1.4. 使用原有ADO.NET代码
. 现有的 ADO.NET 2.0 代码将继续在 LINQ to DataSet 应用程序中有效。
. 下图阐释了 LINQ to DataSet 与ADO.NET 2.0和数据存储区的关系。
1.4. 查询数据集
. 填充 DataSet
– XxxDataAdapter
– LINQ to SQL
. 主要使用下面两个扩展类
– DataRowExtensions
– DataTableExtensions
. 查询支持
– 类型化数据集
– 非类型化数据集
1.5. 构建N层应用程序
• 在 N 层应用程序中,DataSet 通常用于中间层以缓存 Web 应用程序的信息。
• LINQ to DataSet 查询功能通过扩展方法实现,并扩展现有的 ADO.NET 2.0 DataSet。
2. LINQ to DataSet 查询
2.1. 启用 LINQ to DataSet 功能
• 要求.NET Framework 3.5
• 引用 System.Data.DataSetExtensions 程序集
2.2. 使用标准查询运算符
• 可以使用下面LINQ标准查询运算符
– from
– where
– select
2.3. 基于方法的查询语法
• 表述 LINQ to DataSet 查询的另一种方法
• 是对 LINQ 运算符方法的一系列直接方法调用
• 需要将 Lambda 表达式作为参数进行传递
2.4. 延迟查询
. 当查询旨在返回一系列值时,查询变量本身只存储查询命令。
. 如果查询不包含可使查询立即执行的方法,则查询的实际执行将会推迟,直到在
foreach 或For Each 循环中循环访问查询变量。
. 延迟执行可使多个查询组合在一起或使查询得到扩展。
2.5. 主动查询
• 使用下列方法可以进行主动查询:
– ToList<TSource>
– ToArray<TSource>
– ToLookup
– ToDictionary
2.6. 交叉表查询
• LINQ 提供两个联接运算符
– Join:对于关系数据库,Join 实现内部联接。
– GroupJoin:对于关系数据库,GroupJoin 运算符没有直接等效项,它们实现内部联接和左外
部联接的超集。
• 这些运算符执行同等联接,即仅在键相等时匹配两个数据源的联接。
2.7. 查询类型化数据集
. 对于类型化 DataSet,不必使用泛型 Field方法或 SetField 方法即可访问列数据。
. 由于DataSet 中包括类型信息,因此属性名称在编译时可用。
. LINQ to DataSet 提供对正确类型的列值的访问,以便可以在编译代码时而不是在运
行时捕获类型不匹配错误。
2.8. 比较 DataRow
• LINQ 定义多种用于比较源元素的集合运算符以查看它们是否相等:
– Distinct:返回序列中的非重复元素
– Union:生成两个序列的并集
– Intersect:生成两个序列的交集
– Except:生成两个序列的差集
• 这些运算符通过对每个元素集合调用GetHashCode 和Equals 方法来比较源元素。
2.9. 通过查询创建数据表
• CopyToDataTable 方法
• 它使用下面的过程通过查询创建DataTable
– CopyToDataTable 方法克隆源表中的DataTable
– 克隆的 DataTable 的架构从源表中枚举的第一个DataRow 对象的列生成,克隆表的名称是源表的名称
后面追加单词“query”。
– 对于源表中的每一行,会将行内容复制到新DataRow对象中,然后将该对象插入到克隆表中。
– 复制完可查询的输入表中的所有 DataRow 对象后,将返回克隆的DataTable。如果源序列不包含任何
DataRow 对象,则该方法将返回一个空 DataTable。
2.10. 数据绑定和 LINQ to DataSet
• LINQ to DataSet 通过提供基于表达式的LINQ 筛选和排序,扩展了 DataView 筛选和排序的功能,它允许执行比基于字符吕
睥筛选和排序更为复杂且功能更为强大的筛选和排序操作。
.琩. ㄏノよ猭.︽.琩. ToList<TSource> ToArray<TSource> ToLookup ToDictionary