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

このチュートリアルでは、LINQ to SQLLINQ to SQL の "関連付け" を使用してデータベース内の外部キー リレーションシップを表現する方法について説明します。This walkthrough demonstrates the use of LINQ to SQLLINQ to SQL associations to represent foreign-key relationships in the database.

注意

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。The Visual Studio edition that you have and the settings that you use determine these elements. 詳細については、「IDE をカスタマイズする」をご覧ください。For more information, see Personalizing the IDE.

このチュートリアルは、Visual Basic 開発設定を使用して記述されています。This walkthrough was written by using Visual Basic Development Settings.

必須コンポーネントPrerequisites

チュートリアル:簡単なオブジェクト モデルとクエリ (Visual Basic)」を完了している必要があります。You must have completed Walkthrough: Simple Object Model and Query (Visual Basic). このチュートリアルは前のチュートリアルに基づいて作成されており、c:\linqtest に northwnd.mdf ファイルがあることが前提です。This walkthrough builds on that one, including the presence of the northwnd.mdf file in c:\linqtest.

概要Overview

このチュートリアルは、主に次の 3 つの手順で構成されています。This walkthrough consists of three main tasks:

  • エンティティ クラスを追加して、Northwind サンプル データベース内の Orders テーブルを表します。Adding an entity class to represent the Orders table in the sample Northwind database.

  • Customer クラスに注釈を付けて、Customer クラスと Order クラス間のリレーションシップを強化します。Supplementing annotations to the Customer class to enhance the relationship between the Customer and Order classes.

  • クエリを作成および実行して、Order クラスによる Customer 情報の取得のプロセスをテストします。Creating and running a query to test the process of obtaining Order information by using the Customer class.

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

Customer クラス定義の後に、次のコードから成る Order エンティティ クラス定義を作成します。これは、Orders.Customer が外部キーとして Customers.CustomerID に関係することを示しています。After the Customer class definition, create the Order entity class definition that includes the following code, which indicates that Orders.Customer relates as a foreign key to Customers.CustomerID.

Order エンティティ クラスを追加するにはTo add the Order entity class

  • Customer クラスの後に次のコードを入力または貼り付けます。Type or paste the following code after the Customer class:

    <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 クラスに注釈を付けるAnnotating the Customer Class

ここでは、Customer クラスに注釈を付けて、Order クラスとのリレーションシップを指定します。In this step, you annotate the Customer class to indicate its relationship to the Order class. いずれかの方向のリレーションシップが定義されていればリンクを作成できるため、この注釈の追加は必ずしも必要ではありません。(This addition is not strictly necessary, because defining the relationship in either direction is sufficient to create the link. しかし、この注釈を追加することで、どちらの方向でも簡単にオブジェクトを移動できます。But adding this annotation does enable you to easily navigate objects in either direction.)

Customer クラスに注釈を付けるにはTo annotate the Customer class

  • Customer クラスに次のコードを入力または貼り付けます。Type or paste the following code into the Customer class:

    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 リレーションシップ間のクエリを作成および実行するCreating and Running a Query across the Customer-Order Relationship

Order オブジェクトから Customer オブジェクトに、またはその逆の順序で、直接アクセスできます。You can now access Order objects directly from the Customer objects, or in the opposite order. Customer と Order の間に、明示的な "結合" は必要ありません。You do not need an explicit join between customers and orders.

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

  1. Sub Main メソッドに次のコードを入力または貼り付けることによって、メソッドを変更します。Modify the Sub Main method by typing or pasting the following code into the method:

    ' 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 キーを押して、アプリケーションをデバッグします。Press F5 to debug your application.

    2 つの名前がメッセージ ボックスに表示され、生成された SQL コードがコンソール ウィンドウに表示されます。Two names appear in the message box, and the Console window shows the generated SQL code.

  3. メッセージ ボックスを閉じて、デバッグを停止します。Close the message box to stop debugging.

データベースの厳密に型指定されたビューを作成するCreating a Strongly Typed View of Your Database

データベースの厳密に型指定されたビューを使用すると、操作が非常に簡単になります。It is much easier to start with a strongly typed view of your database. DataContext オブジェクトを厳密に型指定することによって、GetTable を呼び出す必要がありません。By strongly typing the DataContext object, you do not need calls to GetTable. 厳密に型指定された DataContext オブジェクトを使用する場合は、すべてのクエリで、厳密に型指定されたテーブルを使用できます。You can use strongly typed tables in all your queries when you use the strongly typed DataContext object.

次の手順では、データベース内の Customers テーブルに対応する厳密に型指定されたテーブルとして、Customers を作成します。In the following steps, you will create Customers as a strongly typed table that maps to the Customers table in the database.

DataContext オブジェクトを厳密に型指定するにはTo strongly type the DataContext object

  1. Customer クラス宣言の上に次のコードを追加します。Add the following code above the Customer class declaration.

    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 を使用するようにします。Modify Sub Main to use the strongly typed DataContext as follows:

    ' 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 キーを押して、アプリケーションをデバッグします。Press F5 to debug your application.

    コンソール ウィンドウの出力は次のとおりです。The Console window output is:

    ID=WHITC

  4. コンソール ウィンドウで Enter キーを押してアプリケーションを終了します。Press Enter in the Console window to close the application.

  5. このアプリケーションを保存するには、 [ファイル] メニューの [すべてを保存] をクリックします。On the File menu, click Save All if you want to save this application.

次の手順Next Steps

次のチュートリアル「チュートリアル: データの操作 (Visual Basic)」では、データの操作方法について説明します。The next walkthrough (Walkthrough: Manipulating Data (Visual Basic)) demonstrates how to manipulate data. そのチュートリアルを実行するのに、既に終了したこのシリーズの 2 つのチュートリアルを保存する必要はありません。That walkthrough does not require that you save the two walkthroughs in this series that you have already completed.

関連項目See also