LINQ to DataSet學習筆記
Linq有很多值得學習的地方,這里我們主要介紹LINQ to DataSet,包括介紹對IEnumeralbe進行數據行的集合操作等方面。
要了解LINQ to DataSet,首先,讓我們來看看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: 要獲取的數據行的版本
在使用LINQ to DataSet的時候需要注意以下幾個方面:
1.在對IEnumeralbe進行數據行的集合操作如Distinct, Except, Union, Intersect, SequenceEqual時,需要使用System.Data.DatarowComparer.Default作為比較器作為輸入參數,以保證對 DataRow是進行值比較,而不是引用比較。當然,如果GroupBy或者其他操作的key的類型是DataRow時,也需要使用此比較器,以使我們得到我們期望的行為。
2.SetField可以將字段值設置為null,并且SetField方法將自動將其轉換為DBNull.Value.
3.Field可以完成從DBNull.Value到null的轉換。也就是說,如果該字段的值是DBNull.Value 時,Field方法將自動將其轉為null并返回。這個方法是強類型的,不需要象通過列名或者列索引返回字段值一樣將Object類型進行造型成需要的類型(值類型進行拆箱操作),(如果字段的值是DBNull.Value時進行造型還將導致拋出異常)Field擴展方法自動做了這些處理,省去了開發人員手動進行這些處理的麻煩。
4.缺省情況下,數據行的Original版本中是沒有值的,試圖訪問時將導致異常發生。當然,可以在訪問之前使用DataRow.HasVersion來進行判斷,以防止異常的發生。也可以通過調用DataRow.AcceptChanges方法來建立Original版本來避免異常的發生。不帶LoadOptions參數的CopyToDataTable擴展方法也會為返回的DataTable 自動建立DataRow的Original和Current版本.
5.當使用帶LoadOptions輸入參數的CopyToDataTable擴展方法時,必須為目標DataTable指定主鍵列,否則,該函數只是將源DataTable追加到目標DataTable的最后面。可能達不到期望更新的結果。
【編輯推薦】