|     | 
  | 
 
特集:VBプログラマーのためのLINQ超入門(前編)
LINQ(リンク)の基礎知識
デジタルアドバンテージ 遠藤 孝信 
2008/09/26 | 
  | 
  | 
■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とほぼ同じになっています。
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間