特集:VBプログラマーのためのLINQ超入門(前編)

LINQ(リンク)の基礎知識

デジタルアドバンテージ 遠藤 孝信
2008/09/26
Page1 Page2 Page3 Page4

■LINQによるデータベースへの問い合わせ

 リスト1と同じ処理を、LINQを使って記述すると次のようになります。実行結果はリスト1の場合とまったく同じです。

Module Module1

  Sub Main()

    ' NorthWindDataContextクラスはVS 2008により自動生成
    Dim dc As New NorthWindDataContext()

    ' LINQによる問い合わせ
    Dim records = _
      From n In dc.Orders _
      Where n.ShipCountry = "Norway" _
      Select n

    ' 問い合わせ結果の表示
    For Each r In records
      Console.WriteLine("{0}, {1}, {2}, {3}", _
      r.OrderID, r.EmployeeID, r.OrderDate, r.ShipCountry)
    Next

    Console.ReadLine()
  End Sub

End Module
リスト2 LINQによるデータベースの検索
コードの実行方法については次回で解説。

 リスト2では、2個所でVB 9.0の新機能である「型推論(ローカル型の推論)」を使ってローカル変数(recordsとr)を宣言しています。これは、As句による変数の型指定を省略できる機能で、変数に代入される値の型が右辺から分かる(確実に推測できる)場合には、「Dim <変数名> = ……」と宣言するだけでコンパイラが自動的に変数の型を設定してくれます。

 型推論の機能を使わずに(As句を省略せずに)、変数の型を明示的して記述すると、リスト2は次のリスト3のようになります(LINQを使ううえでは、「IEnumerable(Of Orders)型」のようなジェネリック型を避けて通ることはできません。ジェネリックに関しては「特集:C#&VBジェネリック超入門」をご覧ください)。

Module Module1

  Sub Main()

    ' NorthWindDataContextクラスはVS 2008により自動生成
    Dim dc As New NorthWindDataContext()

    ' LINQによる問い合わせ
    Dim records IEnumerable(Of Orders) = _
      From n In dc.Orders _
      Where n.ShipCountry = "Norway" _
      Select n

    ' 問い合わせ結果の表示
    For Each r As Orders In records
      Console.WriteLine("{0}, {1}, {2}, {3}", _
      r.OrderID, r.EmployeeID, r.OrderDate, r.ShipCountry)
    Next

    Console.ReadLine()
  End Sub

End Module
リスト3 LINQによるデータベースの検索(型推論機能不使用版)
太字部分はリスト2からの変更個所。

 先頭の行でインスタンス化を行っているNorthWindDataContextクラスは、VS 2008の新機能の1つである「O/Rデザイナ」で作成したクラスです、これはO/Rデザイナの画面にテーブル項目をドラッグ&ドロップするだけで自動生成させることができるのですが、VS 2008でこのリスト2およびリスト3のコードを実行するまでの手順については次回の後編で解説します(本稿の最後では、フリーのツールを使ってOrdersテーブルに対してクエリを実行する方法を示しています)。

 そして、その次の行がLINQによるクエリ(問い合わせ)です(次のリスト4に抜粋)。ここでは読みやすいように改行して3行で記述していますが、1行で書いてもOKです。

From n In dc.Orders _
Where n.ShipCountry = "Norway" _
Select n
リスト4 LINQで記述したクエリ(問い合わせ)

 このクエリの意味は、

『Ordersテーブルから取り出したレコード(ここでは変数nで示す)について、そのShipCountry列の値が「Norway」であるものを抽出する』

というものです(詳しくは後述)。SQL文と比べると記述する順序が完全に逆で、LINQではまずFrom句を書く必要がありますが、全体的にはSQL文と似ていることが分かります(似ているのに微妙に異なるところが実は少々厄介ですが)。

 VS 2008のエディタでは「Where n.」と入力したところで、続けて記述可能な候補一覧がIntelliSense機能により表示されますが、次の図のように、これにはOrdersテーブルの列項目が含まれています。


VS 2008のIntelliSense機能による列名の補完

■LINQによるコレクションへの問い合わせ

 LINQの優れている点は、データベース以外に対しても問い合わせが可能なところです。次のコードでは、Ordersテーブルに似せたOrdersクラスを定義し、そのインスタンスの配列に対してLINQを使っています。

Class Orders

  Public OrderID As Integer
  Public EmployeeID As Integer
  Public OrderDate As DateTime
  Public ShipCountry As String

  ' コンストラクタ
  Public Sub New(ByVal id As Integer, ByVal emp As Integer, ByVal [date] As DateTime, ByVal ship As String)
    Me.OrderID = id
    Me.EmployeeID = emp
    Me.OrderDate = [date]
    Me.ShipCountry = ship
  End Sub

End Class

Module Module1

  Sub Main()

    ' Ordersオブジェクトの配列
    Dim data As Orders() = New Orders() { _
      New Orders(1000, 1, DateTime.Now, "Norway"), _
      New Orders(1001, 3, DateTime.Now, "Germany"), _
      New Orders(1002, 7, DateTime.Now, "Norway"), _
      New Orders(1003, 7, DateTime.Now, "poland")}

    '  LINQによる問い合わせ
    Dim records As IEnumerable(Of Orders) = _
      From n In data _
      Where n.ShipCountry = "Norway" _
      Select n

    ' 問い合わせ結果の表示
    For Each r As Orders In records
      Console.WriteLine("{0}, {1}, {2}, {3}", _
        r.OrderID, r.EmployeeID, r.OrderDate, r.ShipCountry)
    Next

    Console.ReadLine()
  End Sub

End Module
リスト5 LINQによるコレクションの検索

1000, 1, 2008/09/25 3:41:52, Norway
1002, 7, 2008/09/25 3:41:52, Norway
リスト5の実行結果(例)

 クエリ以外のコードはこれまでのVBの機能のみで記述しています。そしてクエリとその結果表示部分はリスト2とほぼ同じになっています。


 INDEX
  VBプログラマーのためのLINQ超入門(前編)
  LINQ(リンク)の基礎知識
    1.ADO.NET+SQL文によるデータベースへの問い合わせ
  2.LINQによるデータベース/コレクションへの問い合わせ
    3.クエリの実行を支えるさまざまなLINQプロバイダ/LINQの書き方
    4.そのほかのポイント/LINQPadの紹介
 
  VBプログラマーのためのLINQ超入門(後編)
  LINQによるデータベース・アクセスとO/Rマッピング
    1.LINQのメソッド構文
    2.データベースの問い合わせを行うLINQ to SQL
    3.O/RマッピングとLINQ to SQL


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間