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

  1. 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)
    
  2. 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.

  3. 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

  1. 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
    
  2. 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()
    
  3. Presione F5 para depurar la aplicación.

    El resultado en la ventana Consola es:

    ID=WHITC

  4. Presione Entrar en la ventana Consola para cerrar la aplicación.

  5. 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.

Vea también

Conceptos

Aprender mediante tutoriales (LINQ to SQL)