Tutorial: Realizar consultas en varias relaciones (Visual Basic) (LINQ to SQL)
Actualización: November 2007
Este tutorial muestra el uso de asociaciones LINQ to SQL para representar relaciones de clave externa en la base de datos.
Nota: |
---|
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edición de Visual Studio que se tenga y la configuración que se utilice determinan estos elementos. Para obtener más información, vea Valores de configuración de Visual Studio. |
Este tutorial se escribió con la configuración de desarrollo de Visual Basic.
Requisitos previos
Debe de haber completado Tutorial: Modelo de objetos simple y consultas (Visual Basic) (LINQ to SQL). Este tutorial se basa en el tutorial mencionado, incluida la presencia del archivo northwnd.mdf en c:\linqtest.
Información general
Este tutorial conlleva tres tareas principales:
Agregar una clase de entidad para representar la tabla Orders en la base de datos de ejemplo Northwind.
Complementar las anotaciones de la clase Customer para mejorar la relación entre las clases Customer y Order.
Crear y ejecutar una consulta para probar el proceso de obtener información de Order mediante la clase Customer.
Asignar relaciones entre tablas
Después de la definición de la clase Customer, cree la definición de la clase de entidad Order, que incluye el código siguiente, que indica que Orders.Customer se relaciona como clave externa con Customers.CustomerID.
Para agregar la clase de entidad Order
Escriba o pegue el código siguiente después de la clase 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
Anotar la clase Customer
En este paso, anotará la clase Customer para indicar su relación con la clase Order. (Esta adición no es estrictamente necesaria, porque para crear el vínculo basta con definir la relación en cualquier dirección. Sin embargo, al agregar esta anotación, se puede navegar con facilidad por los objetos en cualquier dirección.)
Para anotar la clase Customer
Escriba o pegue el código siguiente en la clase 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
Crear y ejecutar una consulta en la relación Customer-Order
Ahora puede tener acceso a los objetos Order directamente desde los objetos Customer, o a la inversa. No necesita una combinación explícita entre clientes y pedidos.
Para tener acceso a los objetos Order a través de los objetos Customer
Modifique el método Sub Main; para ello, escriba o pegue el código siguiente en el método:
' 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)
Presione F5 para depurar la aplicación.
En el cuadro de mensaje aparecen dos nombres y la ventana Consola muestra el código SQL generado.
Cierre el cuadro de mensaje para detener la depuración.
Crear una vista de la base de datos con establecimiento inflexible de tipos
Es mucho más fácil empezar por una vista con establecimiento inflexible de tipos de la base de datos. Si el objeto DataContext tiene establecimiento inflexible de tipos, no es necesario realizar llamadas a GetTable. Puede utilizar tablas con establecimiento inflexible de tipos en todas sus consultas al utilizar el objeto DataContext con establecimiento inflexible de tipos.
En los pasos siguientes, creará Customers como una tabla con establecimiento inflexible de tipos que está asignada a la tabla Customers de la base de datos.
Para que el objeto DataContext tenga establecimiento inflexible de tipos
Agregue el siguiente código encima de la declaración de la clase 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
Modifique Sub Main para que utilice el objeto DataContext con establecimiento inflexible de tipos de la manera siguiente:
' 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()
Presione F5 para depurar la aplicación.
El resultado en la ventana Consola es:
ID=WHITC
Presione Entrar en la ventana Consola para cerrar la aplicación.
En el menú Archivo, haga clic en Guardar todo si desea guardar esta aplicación.
Pasos siguientes
El tutorial siguiente (Tutorial: Manipular datos (Visual Basic) (LINQ to SQL)) muestra cómo manipular los datos. Este tutorial no requiere que guarde los dos tutoriales ya completados de esta serie.