■SQLの簡単なSELECT文とそれに対応するVB.NETのLINQコードの例
・SQLの例:
SELECT * FROM Customers WHERE Country='Japan'
Dim selectedCustomers = From c In Customers Where c.Country = "Japan" Select c
Dim selectedCustomers = Customers.Where(Function(c) c.Country = "Japan").Select(Function(c) c)
■サンプルコード
Dim tableA As New DataTable ' テーブルAにデータを追加する処理 ... Dim tableB As New DataTable ' テーブルBにデータを追加する処理 ... ' テーブルAとテーブルBの共通の列を指定する Dim commonColumn = "ID" ' LINQクエリで共通のデータのみを抽出する Dim query = tableA.AsEnumerable(). Join(tableB.AsEnumerable(), Function(rowA) rowA.Field(Of Integer)(commonColumn), Function(rowB) rowB.Field(Of Integer)(commonColumn), Function(rowA, rowB) rowA) ' 結果を出力する For Each row In query ' 各行のデータにアクセスする処理 ... Next
この例では、Joinメソッドを使用して、テーブルAとテーブルBの共通の列(ID)に基づいて内部結合を行い、両方に存在するデータのみを抽出しています。
Joinメソッドの第1引数には、テーブルAをAsEnumerableメソッドでIEnumerable(Of DataRow)型に変換したものを指定し、第2引数には、テーブルBをAsEnumerableメソッドでIEnumerable(Of DataRow)型に変換したものを指定します。第3引数には、テーブルAとテーブルBの共通の列を指定します。この例では、Functionキーワードを使用して、共通の列(ID)を指定しています。
Joinメソッドの第4引数には、2つのテーブルから抽出した行の情報を組み合わせて、新しい行を作成するための関数を指定します。この例では、テーブルAの行をそのまま返すために、Function(rowA, rowB) rowAという関数を指定しています。
結果は、IEnumerable(Of DataRow)型で返されます。そのため、For Eachループで各行のデータにアクセスすることができます。