Пошаговое руководство. Выполнение запросов со связями (Visual Basic) (LINQ to SQL)

Обновлен: November 2007

В данном пошаговом руководстве демонстрируется использование ассоциаций LINQ to SQL для представления связей внешних ключей в базе данных.

Bb399346.alert_note(ru-ru,VS.90).gifПримечание.

На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Это пошаговое руководство было написано с помощью параметров разработки Visual Basic.

Предварительные требования

Необходимо выполнить Пошаговое руководство. Простая модель объектов и простой запрос (Visual Basic) (LINQ to SQL). На этом пошаговом руководстве основано руководство, описываемое в данном разделе. В частности на компьютере должен иметься файл northwnd.mdf в папке c:\linqtest.

Общие сведения

Данное пошаговое руководство состоит из трех основных задач.

  • Добавление класса сущности, который представляет таблицу "Orders" в базе данных "Northwind".

  • Добавление примечаний к классу 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 или в обратном направлении. Объединять явным образом клиентов и заказы не требуется.

Получение доступа к объектам "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, чтобы начать отладку приложения.

    В окне сообщения отобразятся два имени, и в окне "Консоль" появится созданный код 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. Чтобы закрыть приложение, в окне "Консоль" нажмите клавишу ВВОД.

  5. Если требуется сохранить приложение, в меню Файл выберите команду Сохранить все.

Следующие действия

В следующем пошаговом руководстве (Пошаговое руководство. Обработка данных (Visual Basic) (LINQ to SQL)) демонстрируется управление данными. Для этого пошагового руководства не требуется сохранять два пошаговых руководства, которые уже выполнены в этой серии.

См. также

Основные понятия

Обучение с помощью пошаговых руководств (LINQ to SQL)