您的位置:知识库 » 数据库

LINQ To DataSet

作者: lazybee  来源: 博客园  发布时间: 2008-09-23 14:16  阅读: 24064 次  推荐: 0   原文链接   [收藏]  
[1] LINQ To DataSet
[2] LINQ To DataSet
[3] 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) where T : DataRow

从定义中就可以看出这三类主要是提供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: 要获取的数据行的版本

0
0
标签:linq dataset

数据库热门文章

    数据库最新文章

      最新新闻

        热门新闻