Пошаговое руководство. Выполнение запросов со связями (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). На этом пошаговом руководстве основано руководство, описываемое в данном разделе. В частности на компьютере должен иметься файл northwnd.mdf в папке c:\linqtest.This walkthrough builds on that one, including the presence of the northwnd.mdf file in c:\linqtest.

ОбзорOverview

Данное пошаговое руководство состоит из трех основных задач.This walkthrough consists of three main tasks:

  • Добавление класса сущности, который представляет таблицу "Orders" в базе данных "Northwind".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. Явное соединение между клиентами и заказами не требуется.You do not need an explicit join between customers and orders.

Получение доступа к объектам "Order" с помощью объектов "Customer"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.

    В окне сообщения отобразятся два имени, и в окне "Консоль" появится созданный код 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. Чтобы закрыть приложение, в окне "Консоль" нажмите клавишу ВВОД.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. Для этого пошагового руководства не требуется сохранять два пошаговых руководства, которые уже выполнены в этой серии.That walkthrough does not require that you save the two walkthroughs in this series that you have already completed.

См. такжеSee also