Compartilhar via


Passo a passo: consultar entre relações (Visual Basic)

Este passo a passo demonstra o uso de associações do LINQ to SQL para representar relacionamentos de chave estrangeira no banco de dados.

Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos elementos de interface do usuário do Visual Studio nas instruções a seguir. A edição do Visual Studio que você possui e as configurações que você usa determinam esses elementos. Para obter mais informações, consulte Personalizando o IDE.

Este passo a passo foi escrito usando as Configurações de Desenvolvimento do Visual Basic.

Pré-requisitos

Você deve ter concluído o Passo a passo: modelo de objeto simples e consulta (Visual Basic). Este passo a passo é baseado naquele, incluindo a presença do arquivo northwnd.mdf em c:\linqtest.

Visão geral

Este passo a passo consiste em três tarefas principais:

  • Adicionando uma classe de entidade para representar a tabela Orders no banco de dados de exemplo Northwind.

  • Suplementando anotações à classe Customer para aprimorar a relação entre as classes Customer e Order.

  • Criando e executando uma consulta para testar o processo de obtenção de informações de Order usando a classe Customer.

Relações de mapeamento entre tabelas

Depois de definir a classe Customer, crie a definição da classe de entidade Order que inclui o código a seguir, que indica que Orders.Customer se relaciona como uma chave estrangeira a Customers.CustomerID.

Para adicionar a classe de entidade Order

  • Digite ou cole o código a seguir depois da classe 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
    

Anotando a classe Customer

Nesta etapa, você anota a classe Customer para indicar sua relação com a classe Order. (Essa adição não é estritamente necessária, pois definir a relação em qualquer direção é suficiente para criar o link. Mas adicionar essa anotação permite que você navegue facilmente por objetos em qualquer direção.)

Para anotar a classe Customer

  • Digite ou cole o código a seguir na classe 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
    

Criando e executando uma consulta pela relação de Customer-Order

Agora você pode acessar objetos Order diretamente nos objetos Customer ou na ordem oposta. Você não precisa de um join explícito entre clientes e pedidos.

Para acessar objetos Order usando objetos Customer

  1. Modifique o método Sub Main digitando ou colando o seguinte código no 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. Pressione F5 para depurar seu aplicativo.

    Dois nomes aparecem na caixa de mensagem, e a janela Console mostra o código SQL gerado.

  3. Feche a caixa de mensagem para interromper a depuração.

Criando uma exibição fortemente tipada do seu banco de dados

É muito mais fácil começar com uma exibição fortemente tipada do seu banco de dados. Com o objeto DataContext fortemente tipado, você não precisa de chamadas para GetTable. Você pode usar tabelas fortemente tipadas em todas as consultas quando usa o objeto DataContext fortemente tipado.

Nas etapas a seguir, você criará Customers como uma tabela fortemente tipada que mapeia para a tabela Customers no banco de dados.

Para tornar o objeto DataContext fortemente tipado

  1. Adicione o código a seguir acima da declaração da classe 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 usar o DataContext fortemente tipado da seguinte maneira:

    ' 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. Pressione F5 para depurar seu aplicativo.

    A saída da janela Console é:

    ID=WHITC

  4. Pressione Enter na janela Console para fechar o aplicativo.

  5. No menu Arquivo, clique em Salvar Tudo se desejar salvar esse aplicativo.

Próximas etapas

O próximo passo a passo (Passo a passo: Manipulando dados (Visual Basic)) demonstra como manipular dados. Esse passo a passo não requer que você salve os dois tutoriais passo a passo desta série que você já concluiu.

Confira também