チュートリアル: リレーションシップを介したクエリの実行 (Visual Basic)

このチュートリアルでは、LINQ to SQL の associations を使用してデータベース内の外部キー リレーションシップを表現する方法について説明します。

注意

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

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

必須コンポーネント

チュートリアル:簡単なオブジェクト モデルとクエリ (Visual Basic)」を完了している必要があります。 このチュートリアルは前のチュートリアルに基づいて作成されており、c:\linqtest に northwnd.mdf ファイルがあることが前提です。

概要

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

  • エンティティ クラスを追加して、Northwind サンプル データベース内の Orders テーブルを表します。

  • Customer クラスに注釈を付けて、Customer クラスと Order クラス間のリレーションシップを強化します。

  • クエリを作成および実行して、Order クラスによる Customer 情報の取得のプロセスをテストします。

テーブル間のリレーションシップを指定する

Customer クラス定義の後に、次のコードから成る Order エンティティ クラス定義を作成します。これは、Orders.Customer が外部キーとして Customers.CustomerID に関係することを示しています。

Order エンティティ クラスを追加するには

  • Customer クラスの後に次のコードを入力または貼り付けます。

    <Table(Name:="Orders")> _
    Public Class Order
        Private _OrderID As Integer
        Private _CustomerID As String
        Private _Customers As EntityRef(Of Customer)
    
        Public Sub New()
            Me._Customers = New EntityRef(Of Customer)()
        End Sub
    
        <Column(Storage:="_OrderID", DbType:="Int NOT NULL IDENTITY", _
            IsPrimaryKey:=True, IsDBGenerated:=True)> _
        Public ReadOnly Property OrderID() As Integer
            Get
                Return Me._OrderID
            End Get
        End Property
        ' No need to specify a setter because IsDBGenerated is true.
    
        <Column(Storage:="_CustomerID", DbType:="NChar(5)")> _
        Public Property CustomerID() As String
            Get
                Return Me._CustomerID
            End Get
            Set(ByVal value As String)
                Me._CustomerID = value
            End Set
        End Property
    
        <Association(Storage:="_Customers", ThisKey:="CustomerID")> _
        Public Property Customers() As Customer
            Get
                Return Me._Customers.Entity
            End Get
            Set(ByVal value As Customer)
                Me._Customers.Entity = value
            End Set
        End Property
    End Class
    

Customer クラスに注釈を付ける

ここでは、Customer クラスに注釈を付けて、Order クラスとのリレーションシップを指定します。 (いずれかの方向のリレーションシップが定義されていればリンクを作成できるため、この注釈の追加は必ずしも必要ではありません。しかし、この注釈を追加することで、どちらの方向でも簡単にオブジェクトを移動できます。)

Customer クラスに注釈を付けるには

  • Customer クラスに次のコードを入力または貼り付けます。

    Private _Orders As EntitySet(Of Order)
    
    Public Sub New()
        Me._Orders = New EntitySet(Of Order)()
    End Sub
    
    <Association(Storage:="_Orders", OtherKey:="CustomerID")> _
    Public Property Orders() As EntitySet(Of Order)
        Get
            Return Me._Orders
        End Get
        Set(ByVal value As EntitySet(Of Order))
            Me._Orders.Assign(value)
        End Set
    End Property
    

Customer-Order リレーションシップ間のクエリを作成および実行する

Order オブジェクトから Customer オブジェクトに、またはその逆の順序で、直接アクセスできます。 Customer と Order の間に、明示的な "結合" は必要ありません。

Customer オブジェクトを使用して Order オブジェクトにアクセスするには

  1. Sub Main メソッドに次のコードを入力または貼り付けることによって、メソッドを変更します。

    ' Query for customers who have no orders.
    Dim custQuery = _
        From cust In Customers _
        Where Not cust.Orders.Any() _
        Select cust
    
    Dim msg As String = "", title As String = _
        "Customers With No Orders", response As MsgBoxResult, _
        style As MsgBoxStyle = MsgBoxStyle.Information
    
    For Each custObj In custQuery
        msg &= String.Format(custObj.CustomerID & vbCrLf)
    Next
    response = MsgBox(msg, style, title)
    
  2. F5 キーを押して、アプリケーションをデバッグします。

    2 つの名前がメッセージ ボックスに表示され、生成された SQL コードがコンソール ウィンドウに表示されます。

  3. メッセージ ボックスを閉じて、デバッグを停止します。

データベースの厳密に型指定されたビューを作成する

データベースの厳密に型指定されたビューを使用すると、操作が非常に簡単になります。 DataContext オブジェクトを厳密に型指定することによって、GetTable を呼び出す必要がありません。 厳密に型指定された DataContext オブジェクトを使用する場合は、すべてのクエリで、厳密に型指定されたテーブルを使用できます。

次の手順では、データベース内の Customers テーブルに対応する厳密に型指定されたテーブルとして、Customers を作成します。

DataContext オブジェクトを厳密に型指定するには

  1. Customer クラス宣言の上に次のコードを追加します。

    Public Class Northwind
        Inherits DataContext
        ' Table(Of T) abstracts database details  per
        ' table/data type.
        Public Customers As Table(Of Customer)
        Public Orders As Table(Of Order)
    
        Public Sub New(ByVal connection As String)
            MyBase.New(connection)
        End Sub
    End Class
    
  2. Sub Main を次のように変更し、厳密に型指定された DataContext を使用するようにします。

    ' Use a connection string.
    Dim db As New Northwind _
        ("C:\linqtest\northwnd.mdf")
    
    ' Query for customers from Seattle.
    Dim custs = _
        From cust In db.Customers _
        Where cust.City = "Seattle" _
        Select cust
    
    For Each custObj In custs
        Console.WriteLine("ID=" & custObj.CustomerID)
    Next
    
    ' Freeze the console window.
    Console.ReadLine()
    
  3. F5 キーを押して、アプリケーションをデバッグします。

    コンソール ウィンドウの出力は次のとおりです。

    ID=WHITC

  4. コンソール ウィンドウで Enter キーを押してアプリケーションを終了します。

  5. このアプリケーションを保存するには、 [ファイル] メニューの [すべてを保存] をクリックします。

次の手順

次のチュートリアル「チュートリアル: データの操作 (Visual Basic)」では、データの操作方法について説明します。 そのチュートリアルを実行するのに、既に終了したこのシリーズの 2 つのチュートリアルを保存する必要はありません。

関連項目