ray88’s diary

お仕事で困ったとき用の自分用の覚書

VB.NET LINQを使用してSQLをかける

SQLの簡単なSELECT文とそれに対応するVB.NETLINQコードの例
SQLの例:

SELECT * FROM Customers WHERE Country='Japan'

VB.NETLINQの例①:クエリ構文を使用

Dim selectedCustomers = From c In Customers
                        Where c.Country = "Japan"
                        Select c

VB.NETLINQの例②:メソッド構文を使用

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ループで各行のデータにアクセスすることができます。