Language-Integrated クエリ (LINQ) クエリは、 IEnumerable<T> インターフェイスまたは IQueryable<T> インターフェイスを実装するデータ ソースで機能します。
DataTable クラスはどちらのインターフェイスも実装していないため、LINQ クエリのAsEnumerable句でDataTableをソースとして使用する場合は、From
メソッドを呼び出す必要があります。
次の例では、SalesOrderHeader テーブルからすべてのオンライン注文を取得し、注文 ID、注文日、注文番号をコンソールに出力します。
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable orders = ds.Tables["SalesOrderHeader"];
var query =
from order in orders.AsEnumerable()
where order.Field<bool>("OnlineOrderFlag") == true
select new
{
SalesOrderID = order.Field<int>("SalesOrderID"),
OrderDate = order.Field<DateTime>("OrderDate"),
SalesOrderNumber = order.Field<string>("SalesOrderNumber")
};
foreach (var onlineOrder in query)
{
Console.WriteLine($"Order ID: {onlineOrder.SalesOrderID} Order date: {onlineOrder.OrderDate:d} Order number: {onlineOrder.SalesOrderNumber}");
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)
Dim orders As DataTable = ds.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
Select New With { _
.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
.OrderDate = order.Field(Of DateTime)("OrderDate"), _
.SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
}
For Each onlineOrder In query
Console.Write("Order ID: " & onlineOrder.SalesOrderID)
Console.Write(" Order date: " & onlineOrder.OrderDate)
Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next
ローカル変数クエリはクエリ式で初期化されます。クエリ式は、標準のクエリ演算子から 1 つ以上のクエリ演算子を適用するか、LINQ to DataSet の場合は、 DataSet クラスに固有の演算子を適用することで、1 つ以上の情報ソースに対して動作します。 前の例のクエリ式では、 Where
と Select
の 2 つの標準クエリ演算子を使用しています。
Where
句は、OnlineOrderFlag
がtrue
に設定されている条件に基づいてシーケンスをフィルター処理します。
Select
演算子は、演算子に渡された引数をキャプチャする列挙可能なオブジェクトを割り当てて返します。 この例では、匿名型は、 SalesOrderID
、 OrderDate
、 SalesOrderNumber
の 3 つのプロパティを使用して作成されます。 これら 3 つのプロパティの値は、SalesOrderID
テーブルのOrderDate
、SalesOrderNumber
、およびSalesOrderHeader
列の値に設定されます。
foreach
ループは、Select
によって返される列挙可能なオブジェクトを列挙し、クエリ結果を生成します。 クエリはEnumerableを実装するIEnumerable<T>型であるため、クエリ変数がforeach
ループを使用して反復処理されるまで、クエリの評価は遅延されます。 遅延クエリ評価を使用すると、クエリを複数回評価できる値として保持でき、そのたびに異なる結果が得られる可能性があります。
Field メソッドは、DataRowの列値にアクセスでき、SetField (前の例では示されていません) はDataRowの列値を設定します。
FieldメソッドとSetFieldメソッドの両方が null 許容値型を処理するため、null 値を明示的にチェックする必要はありません。 どちらのメソッドもジェネリック メソッドです。つまり、戻り値の型をキャストする必要はありません。
DataRowで既存の列アクセサー (o["OrderDate"]
など) を使用することもできますが、その場合は、戻りオブジェクトを適切な型にキャストする必要があります。 列が null 許容値型の場合は、 IsNull メソッドを使用して値が null かどうかを確認する必要があります。 詳細については、「 ジェネリック フィールドと SetField メソッド」を参照してください。
T
メソッドと Field メソッドのジェネリック パラメーターSetFieldで指定されたデータ型は、基になる値の型と一致する必要があります。または、InvalidCastExceptionがスローされることに注意してください。 指定する列の名前も DataSet 内の列名と一致している必要があります。一致していない場合、ArgumentException がスローされます。 どちらの場合も、例外は、実行時にデータが列挙されて、クエリが実行されたときにスローされます。