Linq To DataSetノート

15254 ワード

DataSetとDataTableのレビュー
様々なDataSetとDataTableインデックスを使用する場合、かなり直接的で弱いタイプの方法でデータインタラクションを行うことができます.例:

  
    
static void PrintDataWithIndexers(DataTable dt)
{
// DataTable
for ( int curRow = 0 ; curRow < dt.Rows.Count; curRow ++ )
{
for ( int curCol = 0 ; curCol < dt.Columns.Count; curCol ++ )
{
Console.Write(dt.Rows[curRow][curCol].ToString
+ " \t " );
}
Console.WriteLine();
}
}
DataTableタイプのCreateDataReader()メソッドは、DataSetのデータを線形行セットとして連続的に処理する第2の方法を提供します.

  
    
static void PrintDataWithDataTableReader(DataTable dt)
{
// DataTableReader
DataTableReader dtReader = dt.CreateDataReader();
while (dtReader.Read())
{
for ( int i = 0 ; i < dtReader.FieldCount; i ++ )
{
Console.Write(
" {0}\t " , dtReader.GetValue(i));
}
Console.WriteLine();
}
dtRader.Close();
}
DataSet拡張の役割
  System.Data.DataSetExtensions.dllプログラムセットはいくつかの新しいメンバーを使用してSystemを拡張した.Dataネーミングスペース.最も有用な2つのメンバーは、DataTable ExtensionsとDataRowExtensionsです.これらのタイプは、一連の拡張方法を使用して、DataTableとDataRowの機能を拡張します.もう1つの重要なタイプはTypedTable BaseExtensionsで、内部のDataTableオブジェクトがLinqをサポートする強いタイプのDataSetオブジェクトに使用できる拡張方法を定義します.
Linq対応のDataTableの取得
DataTableをLinq互換オブジェクトに変換する場合は、DataTable Extensionsタイプ定義のAsEnumerable()拡張メソッドを呼び出すだけです.EnumerableRowCollectionオブジェクトが返され、DataRowのセットが含まれます.このタイプを使用すると、各ローを操作できます.サンプルコード:

  
    
// Car
class Car
{
public string ID;
public string Name;
public int Speed;
}

// DataTable Car
static void PrintCarID(DataTable data)
{
// DataTable enumerable
EnumerableRowCollection enumData = data.AsEnumerable();

// ID
foreach (DataRow r in enumData)
Console.WriteLine(
" Car ID = {0} " , r[ " ID " ]);
}
EnumerableRowCollectionはIEnumerableインタフェースを実装しているので、投影を新規作成するには、次の方法を使用します.

  
    
static void ApplyLinqQuery(DataTable data)
{
// Speed 5
var cars = from car in data.AsEnumerable()
where (int)car[ " Speed " ] > 5
select
new
{
ID
= (string)car[ " ID " ],
Name
= (string)car[ " Name " ]
};

foreach (var item in cars)
{
Console.WriteLine(
" ID = {0}, Name = {1} " , item.ID, item.Name);
}
}
現在のLinqクエリー式では、結果セットを収集するために強制型変換演算子とDataRowインデックスが多数使用されています.強いタイプをクエリーに注入するには、DataRowタイプのField()拡張メソッドを使用します.これにより、クエリーにタイプセキュリティを追加できます.前の例のコードは次のように変更できます.

  
    
static void ApplyLinqQuery(DataTable data)
{
// Speed 5
var cars = from car in data.AsEnumerable()
where car.Field<int>( " Speed ") > 5
select
new
{
ID
= car.Field<string>( " ID ") ,
Name
= car.Field<string>( " Name ")
};

foreach (var item in cars)
{
Console.WriteLine(
" ID = {0}, Name = {1} " , item.ID, item.Name);
}
}
Linqクエリから新しいDataTableを生成
IEnumerableとして表されるベースタイプの結果セットがある場合、次のようなCopyToDataTable()拡張メソッドを結果的に呼び出すことができます.

  
    
static void ApplyLinqQuery(DataTable data)
{
// Speed 5
var cars = from car in data.AsEnumerable()
where car.Field<int>( " Speed ") > 5
select
new
{
ID
= car.Field<string>( " ID ") ,
Name
= car.Field<string>( " Name ")
};
// DataTable
DataTable newTable = cars.CopyToDataTable();
........ // DataTable

}
この方法は、Linqクエリの結果をデータバインドソースとして使用する場合に便利です.
AsDataView()拡張メソッドによりLinqクエリをDataViewタイプに変換することもできます.