LINQ To DataSet

LINQ to DataSet主要是提供对离线数据的支持,只有在填充DataSet之后, 我们才能使用LINQ to DataSet来查询数据。其功能主要是通过 System.Data.DataRowExtions和System.Data.DataTableExtensions两个静态类 中的扩展方法来公开的。LINQ to DataSet是LINQ to ADO.Net中的一部分,但这 部分所占比重非常小,内容也比较少。下面就让我们首先来看看 DataTableExtensions中的扩展方法:

public static EnumerableRowCollection<DataRow> AsEnumerable(this DataTable source)
------------------------------------------------------------
public static DataView AsDataView(this DataTable table)
public static DataView AsDataView<T>(this EnumerableRowCollection<T> source) where T : DataRow
-------------------------------------------------------------
public static DataTable CopyToDataTable<T>(this IEnumerable<T> source) where T : DataRow
public static void CopyToDataTable<T>(this IEnumerable<T> source,DataTable table,LoadOption options) where T : DataRow
public static void CopyToDataTable<T>(this IEnumerable<T> source,DataTable table,LoadOption options,FillErrorEventHandler errorHandler)

从定义中就可 以看出这三类主要是提供DataTable、DataView和IEnumerable三者之间的转换。 大家都知道LINQ to Object查询主要是对IEnumerable序列进行的操作,这样就 使得DataTable、DataView和LINQ之间建立了一个转换桥梁。

因此,在我 们需要将DataTable应用于LINQ to DataSet查询是要先调用AsEnumerable完成 DataTable到LINQ的转换。如果我们需要将LINQ to DataSet的查询的结果进行数 据绑定时我们需要调用AsDataView的泛型版来完成LINQ到DataView的转换。当然 我们也可以使用CopyToDataTable来进行LINQ到DataTable的转换。

注意 :如果在我们完成了DataTable到LINQ(IEnumerable)的转换之后(也就是调用 AsEnumerable扩展方法),需要进行两个DataRow序列的集合操作如 Distinct,Union,Except,Intersect,SequenceEqual,这些操作都需要对数据源中 的元素进行相等比较,由于缺省情况下都是调用数据源中的元素的GetHashCode 和Equals操作来判断的,对于DataRow而言就是判断对象的引用是否相等,这样 可能会导致我们不期望的结果(DataRow里面的数据内容是相同的,但不是同一 个对象),所以我们要使用Distinct,Union,Except,Intersect,SequenceEqual 带IEqualityComparer的重载版本,使用System.Data.DataRowComparer.Default 作为参数。这个比较器类是.Net3.5专门为LINQ to DataSet新增加的,用于比较 DataRow的值的,它是通过先比较DataColumn的数量,然后使用该列中类型的 Equals方法进行比较。

不带LoadOptions参数的CopyToDataTable方法将 自动为每一行的每一个字段创建(更新)原始版本和当前版本,带有 LoadOptions参数的CopyToDataTable重载版本可以让你指定是创建(更新)原始 版本或是当前版本,或者两者都填充。LoadOptions选项有下面三个选项值可以 选择:

OverwriteChanges: 创建(更新)每一列的当前值和原始值

PreserveChanges: 创建(更新)每一列的原始值

Upset: 创建( 更新)每一列的当前值

接下来,让我们来看看DataRowExtensions中的扩 展方法。在这个DataRowExtensions中的扩展方法主要是从数据行中获得字段的 值(泛型的Field方法)和设置数据行中字段的值(泛型的SetField方法)。

public static T Field<T>(this DataRow row,DataColumn column)
public static T Field<T>(this DataRow row,int columnIndex)
public static T Field<T>(this DataRow row,string columnName)
public static T Field<T> (this DataRow row,DataColumn column,DataRowVersion version)
public static T Field<T>(this DataRow row,int columnIndex,DataRowVersion version)
public static T Field<T>(this DataRow row,string columnName,DataRowVersion version)
public static void SetField<T>(this DataRow row,DataColumn column,T value)
public static void SetField<T>(this DataRow row,int columnIndex, T value)
public static void SetField<T>(this DataRow row,string columnName,T value)

其中,row: 是我们要使用的数据行对象实例

column: 指定要返回(设 置)其值的列

columnIndex: 指定要返回(设置)其值的列的索引

columnName: 指定要返回(设置)其值的列名

value: 要设置的新 值,如果是null,将自动转换为DBNull.Value

version: 要获取的数据行 的版本

时间: 2024-08-04 13:43:08

LINQ To DataSet的相关文章

LINQ TO DataSet Overview

LINQ TO DataSet Overview 相对而言,LINQ TO DataSet是LINQ技术中最小的一块,虽然是DB中抽取出来 的一个离线的操作模型,但毕竟对象也是个内存里面的object而已.所以和LINQ TO Object相比,大多数的操作都是一样的,不同只是要根据DataSet,DataTable的结构标明字段而已.下面简单的列出LINQ TO DataSet相比LINQ TO Object一些要注意的特色. Query UnTyped DataSet 和一般的LINQ相比,

linq和DataSet中的问题

问题描述 过程是使用linq筛选出DataSet中的特定的数据.varquery=frominfoinds.Tables[0].AsEnumerable()whereinfo.Field<string>("告警类别")=="寿命预警"selectinfo;DataTabledt=query.CopyToDataTable<DataRow>(); 现在遇到一个问题,如果筛选的ds中没有符合筛选条件的数据,就会报错.这里改怎么判断呢?? 解决方案

Linq to DataSet 条件明明相等,却差不错数据

问题描述 DataSetset=newDataSet();using(SqlConnectiontestConnection=newSqlConnection(connectionString)){SqlDataAdapteradapter=newSqlDataAdapter("select*froms",testConnection);adapter.Fill(set);}Sdata.SDataTablestable=newSdata.SDataTable();SdataTableA

linq to dataset 动态查询的一个问题

问题描述 //这个表示选择第一个条件筛选出来的user_novarquery1=(fromtinds.Tables[0].AsEnumerable()grouptbyt.Field<string>("user_no")intogletfact_charge=g.Sum(p=>p.Field<decimal>("fact_charge"))wherefact_charge>cselectnew{user_no=g.Key}).Dis

Linq to DataSet 与linq to entities 实现权限设置模块

数据库(数据库名为test)中表的内容:   if exists (select * from sysobjects where id = OBJECT_ID('[ItemTree]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) DROP TABLE [ItemTree] CREATE TABLE [ItemTree] ( [id] [bigint] IDENTITY (1, 1) NOT NULL, [title] [nvarchar] (50) N

DOTNET:LINQ与ADO.NET 3.0的创新

ado 你知道微软下一代ADO.NET 3.0资料存取技术的重大创新与改革吗? 为了让各位预览未来的ADO.NET 3.0技术,虽然祭司最近一直在忙碌于ASP.NET 2.0出版事宜,但是还是不能荒废引领各位迈向最新指术的伟大宗旨,而这不也是各位来到DotNet开发圣殿最大的目的吗,祭司约略翻译了美国微软副总Somasegar的Blog文章,前一个星期他才出尽了锋头,爆红到整个.NET圈都在引用它的文章,因为它揭露了.NET Framework 3.0的蓝图概貌,以下是翻译: Language-

LINQ的演变及其对C#设计的影响

简单地说,LINQ 是支持以类型安全方式查询数据的一系列语言扩展;它将在代号为"Orcas"的下一个版本 Visual Studio 中发布.待查询数据的形式可以是 XML(LINQ 到 XML).数据库(启用 LINQ 的 ADO.NET,其中包括 LINQ 到 SQL.LINQ 到 Dataset 和 LINQ 到 Entities)和对象 (LINQ 到 Objects) 等.LINQ 体系结构如图 1 所示. 图 1 LINQ 体系结构 让我们看一些代码.在即将发布的"

学Linq to sql(一):预备知识

什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集成查询)的一部分,全称基于关系数据的 .NET 语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能,它和Linq to xml .Linq to objects.Linq to dataset.Linq to entities等组成了强大的LINQ. 要学好LINQ查询语法,就不得不先理解C# 3.0的一些新特性,下面一一简单介绍. 隐含类型局部变量 var age = 26; var

LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法

在本系列中,主要介绍LINQ to SQL基础的东西,因为LINQ太强大了,它对我 们平常使用不同的数据源有着不同的内容,其包括对于SQL Server 数据库的 LINQ to SQL:对于XML 文档的LINQ to XML:对于 ADO.NET 数据集的LINQ to DataSet:对于.NET 集合.文件.字符串等的LINQ to Objects.例外也出现了 一些对LINQ支持的开源项目,例如LINQ to JSON,LINQ for NHibernate等等. 在这个系列中,一些关