Пошаговое руководство. Выполнение запросов со связями (Visual Basic) (LINQ to SQL)
Обновлен: November 2007
В данном пошаговом руководстве демонстрируется использование ассоциаций LINQ to SQL для представления связей внешних ключей в базе данных.
Примечание. |
---|
На вашем компьютере названия некоторых элементов интерфейса пользователя 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"
Измените метод 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)
Нажмите клавишу F5, чтобы начать отладку приложения.
В окне сообщения отобразятся два имени, и в окне "Консоль" появится созданный код SQL.
Закройте окно сообщения, чтобы остановить отладку.
Создание строго типизированного представления базы данных
Общая процедура становится гораздо проще, если в начале использовать строго типизированное представление базы данных. Задавая строгую типизацию объекта DataContext, можно избежать вызовов метода GetTable. Строго типизированные таблицы можно использовать в запросах только при использовании строго типизированного объекта DataContext.
В представленных ниже шагах создается объект Customers в качестве строго типизированной таблицы, которая сопоставляется с таблицей "Customers" в базе данных.
Установка строгой типизации объекта "DataContext"
Добавьте следующий код непосредственно перед объявлением класса 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
Измените метод 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()
Нажмите клавишу F5, чтобы начать отладку приложения.
В окне "Консоль" отобразится следующее:
ID=WHITC
Чтобы закрыть приложение, в окне "Консоль" нажмите клавишу ВВОД.
Если требуется сохранить приложение, в меню Файл выберите команду Сохранить все.
Следующие действия
В следующем пошаговом руководстве (Пошаговое руководство. Обработка данных (Visual Basic) (LINQ to SQL)) демонстрируется управление данными. Для этого пошагового руководства не требуется сохранять два пошаговых руководства, которые уже выполнены в этой серии.