チュートリアル : 簡単なオブジェクト モデルとクエリ (Visual Basic) (LINQ to SQL)

このチュートリアルでは、複雑さを抑えた、LINQ to SQL 全体の基本的なシナリオを示します。サンプルの Northwind データベースにある Customers テーブルのモデル化を行うエンティティ クラスを作成します。次に、住所がロンドンの顧客を表示するための簡単なクエリを作成します。

このチュートリアルでは、LINQ to SQL の考え方を示すために、コード中心の方法をあえて使用しています。通常は、オブジェクト リレーショナル デザイナーを使用してオブジェクト モデルを作成できます。詳細については オブジェクト リレーショナル デザイナ (O/R デザイナ) および オブジェクト リレーショナル デザイナー (O/R デザイナー) および オブジェクト リレーショナル デザイナー (O/R デザイナー).  

メモメモ

お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。

このチュートリアルは、Visual Basic 開発設定を使用して記述されています。

必須コンポーネント

  • このチュートリアルでは、専用フォルダー ("c:\linqtest") を使用してファイルを保持します。チュートリアルを開始する前にこのフォルダーを作成してください。

  • このチュートリアルには、Northwind サンプル データベースが必要です。開発用コンピューターにこのデータベースがない場合は、Microsoft ダウンロード サイトからダウンロードします。手順については、「サンプル データベースのダウンロード (LINQ to SQL)」を参照してください。データベースをダウンロードしたら、ファイルを c:\linqtest フォルダーにコピーします。

概要

このチュートリアルは、主に次の 6 つの手順で構成されています。

  • Visual Studio で LINQ to SQL ソリューションを作成します。

  • データベース テーブルにクラスを割り当てます。

  • クラスに対し、データベース列を表すプロパティを指定します。

  • Northwind データベースへの接続を指定します。

  • データベースに対して実行する簡単なクエリを作成します。

  • クエリを実行し、結果を確認します。

LINQ to SQL ソリューションの作成

最初に、LINQ to SQL プロジェクトをビルドおよび実行するために必要な参照を含む Visual Studio ソリューションを作成します。

LINQ to SQL ソリューションを作成するには

  1. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  2. [新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ペインで、[Visual Basic] をクリックします。

  3. [テンプレート] ペインの [コンソール アプリケーション] をクリックします。

  4. [プロジェクト名] ボックスに「LinqConsoleApp」と入力します。

  5. [OK] をクリックします。

LINQ の参照とディレクティブを追加する

このチュートリアルで使用するアセンブリは、既定ではプロジェクトにインストールされていない場合があります。System.Data.Linq がプロジェクトの参照 (ソリューション エクスプローラー[すべてのファイルを表示] をクリックし、[参照設定] ノードを展開) に表示されていない場合は、以下の手順に従って追加します。

System.Data.Linq を追加するには

  1. ソリューション エクスプローラーで、[参照設定] を右クリックし、[参照の追加] をクリックします。

  2. [参照の追加] ダイアログ ボックスで、[.NET] をクリックし、System.Data.Linq アセンブリをクリックします。次に、[OK] をクリックします。

    アセンブリがプロジェクトに追加されます。

  3. また、[参照の追加] ダイアログ ボックスで、[.NET] をクリックし、[System.Windows.Forms] までスクロールして、これをクリックします。次に、[OK] をクリックします。

    このチュートリアルで使用するメッセージ ボックスをサポートするアセンブリがプロジェクトに追加されます。

  4. Module1 の上に次のディレクティブを追加します。

    Imports System.Data.Linq
    Imports System.Data.Linq.Mapping
    Imports System.Windows.Forms
    

データベース テーブルにクラスを対応付ける

この手順では、クラスを作成して、データベース テーブルに対応付けます。このようなクラスのことをエンティティ クラスと呼びます。対応付けは、TableAttribute 属性を追加するだけで完了します。Name プロパティを使用して、データベースのテーブルの名前を指定します。

エンティティ クラスを作成し、データベース テーブルに対応付けるには

  • Module1.vb で、Sub Main の直前に次のコードを入力または貼り付けます。

    <Table(Name:="Customers")> _
    Public Class Customer
    End Class
    

データベース列を表すプロパティをクラスに追加する

この手順では、いくつかのタスクを実行します。

  • ColumnAttribute 属性を使用して、エンティティ クラスの CustomerID プロパティおよび City プロパティを、データベース テーブルの列を表すものとして指定します。

  • CustomerID プロパティを、データベースの主キー列を表すものとして指定します。

  • プライベートでの格納用として _CustomerID フィールドおよび _City フィールドを指定します。これで、LINQ to SQL は、ビジネス ロジックを含む場合があるパブリック アクセサーを使用せずに、値を直接格納および取得できます。

2 つのデータベース列の特性を指定するには

  • Module1.vb で、End Class の直前に次のコードを入力または貼り付けます。

    Private _CustomerID As String
    <Column(IsPrimaryKey:=True, Storage:="_CustomerID")> _
    Public Property CustomerID() As String
        Get
            Return Me._CustomerID
        End Get
        Set(ByVal value As String)
            Me._CustomerID = value
        End Set
    End Property
    
    Private _City As String
    <Column(Storage:="_City")> _
    Public Property City() As String
        Get
            Return Me._City
        End Get
        Set(ByVal value As String)
            Me._City = value
        End Set
    End Property
    

Northwind データベースへの接続を指定する

この手順では、DataContext オブジェクトを使用して、コードで作成したデータ構造とデータベース本体との間の接続を確立します。データベースからのオブジェクトの取得や、変更内容の送信では、DataContext を仲介役として使用します。

また、データベースの Customers テーブルに対するクエリ用として、型指定された論理的なテーブルの役割を果たす Table(Of Customer) を宣言します。これらのクエリの作成と実行は後の手順で行います。

データベース接続を指定するには

  • Sub Main メソッドに次のコードを入力または貼り付けます。

    northwnd.mdf ファイルは linqtest フォルダーに置かれているものとします。詳細については、このチュートリアルの「前提条件」を参照してください。

    ' Use a connection string.
    Dim db As New DataContext _
        ("c:\linqtest\northwnd.mdf")
    
    ' Get a typed table to run queries.
    Dim Customers As Table(Of Customer) = _
        db.GetTable(Of Customer)()
    

簡単なクエリを作成する

この手順では、データベースの Customers テーブルから、住所が London の顧客を検索するクエリを作成します。この手順で作成するクエリ コードは、クエリを指定するだけです。実行は行いません。このような方法を遅延実行といいます。詳細については、「LINQ クエリの概要 (C#)」を参照してください。

また、LINQ to SQL が生成した SQL コマンドをログに出力します。Log を使用したこのログ機能は、デバッグに有効で、データベースに送信されたコマンドが目的のクエリを正確に表しているかどうかを確認するのに役立ちます。

簡単なクエリを作成するには

  • Sub Main メソッドの Table(Of Customer) 宣言の後に次のコードを入力または貼り付けます。

    ' Attach the log to show generated SQL in a console window.
    db.Log = Console.Out
    
    ' Query for customers in London.
    Dim custQuery = _
        From cust In Customers _
        Where cust.City = "London" _
        Select cust
    

クエリを実行する

この手順では、実際にクエリを実行します。ここまでの手順で作成したクエリ式は、結果が必要になるまでは評価されません。For Each の反復処理を開始した時点で、データベースに対して SQL コマンドが実行され、オブジェクトが実体化されます。

クエリを実行するには

  1. Sub Main メソッドの末尾 (クエリ指定の後) に次のコードを入力または貼り付けます。

    ' Format the message box.
    Dim msg As String = "", title As String = "London customers:", _
        response As MsgBoxResult, style As MsgBoxStyle = _
        MsgBoxStyle.Information
    
    ' Execute the query.
    For Each custObj In custQuery
        msg &= String.Format(custObj.CustomerID & vbCrLf)
    Next
    
    ' Display the results.
    response = MsgBox(msg, style, title)
    
  2. F5 キーを押してアプリケーションをデバッグします。

    メモメモ

    アプリケーションでランタイム エラーが発生した場合は、「チュートリアルによる学習 (LINQ to SQL)」のトラブルシューティングのセクションを参照してください。

    メッセージ ボックスには 6 人の顧客の一覧が表示されます。コンソール ウィンドウには生成された SQL コードが表示されます。

  3. [OK] をクリックしてメッセージ ボックスを閉じます。

    アプリケーションが終了します。

  4. [ファイル] メニューの [すべてを保存] をクリックします。

    引き続き次のチュートリアルに進む場合は、このアプリケーションが必要になります。

次の手順

このチュートリアルに続く内容が、「チュートリアル : リレーションシップ間でのクエリの実行 (Visual Basic) (LINQ to SQL)」のトピックにあります。「リレーションシップ間でクエリを実行する」のチュートリアルでは、リレーショナル データベースの結合と同じように、複数のテーブルにまたがったクエリを LINQ to SQL で行う方法を説明します。

「リレーションシップ間でクエリを実行する」のチュートリアルに進む場合は、必要条件として、ここで完了したチュートリアルのソリューションを保存しておく必要があります。

参照

概念

チュートリアルによる学習 (LINQ to SQL)