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

LINQによるデータベース・アクセスとO/Rマッピング

デジタルアドバンテージ 遠藤 孝信
2009/05/08
Page1 Page2 Page3

 ここからは、LINQによるデータベースの検索(LINQ to SQL)について解説していきます。LINQ to SQLとはすなわち、LINQのクエリをSQL文に変換する機能です。

 前編では、LINQを使ってデータベースを検索するコードのみを示しました(リスト13に再掲します)。このプログラムはNorthWindというデータベースのOrdersテーブルに対して問い合わせを行っています。ここでは、このコードを記述および実行するのに必要な手順を最初から説明していきます。

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
リスト13 LINQによるデータベースの検索例

■LINQ to SQLに必要なVisual Studio 2008の設定

 まずVisual Studio 2008(本稿ではProfessional Editionを使用。以下、VS 2008と略)を起動して、コンソール・アプリケーション*2のプロジェクトを新規作成します。

*2 コンソール・アプリケーションとしたのは、プログラムがシンプルになるためです。別にWindowsアプリケーションでもASP.NETアプリケーションでも何でもOKです。

 次に、使用するデータベースの設定を行います。NorthWindデータベースのデータベース・ファイルである「NORTHWND.MDF」*3を、エクスプローラからソリューション・エクスプローラ内のプロジェクトの部分へドラッグ&ドロップします。[データソース構成ウィザード]が起動しますが、これはキャンセルします(データベース・サーバに接続する場合にはこの作業は不要です)。

*3 NORTHWND.MDFの入手については「連載:Windowsデータベース・プログラミング 第4回」をご覧ください

 続いては、プロジェクトに対して「新しい項目の追加」を行います。テンプレートに「LINQ to SQLクラス」という項目があるので、これを追加します。ファイル名はデータベース名に合わせて「NorthWind」としました。


図1 プロジェクトに追加する「LINQ to SQLクラス」

 [追加]ボタンを押すと、「NorthWind.dbml」がプロジェクトに追加され、今度はVS 2008の中央に「オブジェクト・リレーショナル・デザイナ」(以下、O/Rデザイナ)が開きます。


図2 オブジェクト・リレーショナル・デザイナ(O/Rデザイナ)

 ここでサーバ・エクスプローラを開き、そこからOrdersテーブル(=LINQのクエリで問い合わせを行うテーブル)をO/Rデザイナ上にドラッグ&ドロップします。これによりOrdersテーブルがO/Rデザイナに表示されます(O/Rデザイナについては後述しています)。


図3 O/Rデザイナに配置したOrdersテーブル

 以上で設定は完了です。この設定により、次の2つのクラスが「NorthWind.designer.vb」というファイル内に作成されます(このファイルは既定では非表示になっています)。

  • NorthWindDataContextクラス
  • Ordersクラス

 NorthWindDataContextクラスが出来上がったので、リスト13のプログラムが実行できるようになりました(これらのクラスについても後述します)。Module1.vbにコピー&ペーストして、プログラムを実行してみてください。

■O/RデザイナでデザインするO/Rマッピング

 いま利用したO/RデザイナはVS 2008の新機能で、これは「O/Rマッピング」をデザインするためのツールです。では、O/Rマッピングとは何でしょうか。O/Rデザイナの説明の前に、O/Rマッピングについて説明しておきます。

 O/Rマッピングは「オブジェクト」と「リレーショナル・データ」をマッピング、つまり対応付ける技術です。ここでリレーショナル・データとは、リレーショナル・データベース*4のテーブルに格納されているレコードと考えればよいでしょう。

*4 もちろんSQL Serverはリレーショナル・データベースです。

 NorthWindデータベースの例で説明していきます。

 Ordersテーブルに格納されている注文レコードには、その注文を受け付けた従業員のEmployeeIDが含まれています。そして、その従業員の氏名を知りたい場合には、 Employeesテーブルの、該当するEmployeeIDを含む従業員レコードから得ることができます(図4)。これはEmployeeIDにより、注文データと従業員データが関連付けられている(テーブル間でリレーションシップが設定されている)ためです。


図4 EmployeeIDの値により関連付けられた注文レコードと従業員レコード

 同じような構造のデータは、もちろんVBでも記述できます。

 次の図5のように、例えば「Ordersクラス」と「Employeesクラス」を定義したとすると、OrdersクラスにEmployees型の「担当者プロパティ」を持たせることにより、OrdersオブジェクトとEmployeesオブジェクトを関連付けることができます。


図5 プロパティにより関連付けられた注文オブジェクトと従業員オブジェクト

 このように考えていくと、データベースの各テーブルに対応したクラスを定義し、データベースから読み込んだレコードの値を代入したインスタンスを作成すれば、データベース上でリレーションシップにより関連付けられたレコードを、オブジェクトとして表現することができます。

 これがまさにO/Rマッピングの目的で、O/Rマッピングはデータベースのレコードと(VBの)オブジェクトを関連付け、データベースへのアクセスをオブジェクトの操作に置き換えてしまう仕組みです。これにより、SQL文を書かなくとも、普段から行っているようなオブジェクトの操作の1つとして、データベースがアクセスできてしまうのです。この場合、「レコードの検索=オブジェクトの検索」となるわけですが、ここでLINQによるクエリが使えるわけです。

 LINQによるデータベース・アクセスの処理は、次の図のようなイメージになります。


図6 LINQによるデータベース・アクセスの処理

 データベースからレコードをごっそり取得し、それをオブジェクトにしてからLINQによるクエリを実行するわけではない点に注意してください。LINQのクエリはSQL文に変換され、その実行結果がオブジェクトにマッピングされます。


 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 記事ランキング

本日 月間