次の方法で共有


チュートリアル: リレーションシップ間のクエリ (Visual Basic)

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

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

このチュートリアルは、Visual Basic 開発設定を使用して作成されました。

[前提条件]

「チュートリアル: 単純なオブジェクト モデルとクエリ (Visual Basic)」を完了している必要があります。 このチュートリアルは、c:\linqtest にnorthwnd.mdf ファイルが存在することを含め、そのチュートリアルに基づいています。

概要

このチュートリアルは、次の 3 つの主要なタスクで構成されています。

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

  • CustomerクラスとCustomer クラス間の関係を強化するために、Order クラスに注釈を追加する。

  • Order クラスを使用してCustomer情報を取得するプロセスをテストするクエリの作成と実行。

テーブル間のリレーションシップのマッピング

Customer クラス定義の後に、次のコードを含むOrderエンティティ クラス定義を作成します。これは、Orders.CustomerCustomers.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オブジェクトにアクセスできるようになりました。 顧客と注文の間に明示的な 結合 は必要ありません。

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

  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 つのチュートリアルを保存する必要はありません。

こちらも参照ください