Linq To DataSetノート
15254 ワード
DataSetとDataTableのレビュー
様々なDataSetとDataTableインデックスを使用する場合、かなり直接的で弱いタイプの方法でデータインタラクションを行うことができます.例:
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のセットが含まれます.このタイプを使用すると、各ローを操作できます.サンプルコード:インタフェースを実装しているので、投影を新規作成するには、次の方法を使用します.()拡張メソッドを使用します.これにより、クエリーにタイプセキュリティを追加できます.前の例のコードは次のように変更できます.
IEnumerableとして表されるベースタイプの結果セットがある場合、次のようなCopyToDataTable()拡張メソッドを結果的に呼び出すことができます.
AsDataView()拡張メソッドによりLinqクエリをDataViewタイプに変換することもできます.
様々な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
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