Partilhar via


Passo a passo: Consultando entre relacionamentos (Visual Basic)

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

Nota

Seu computador pode mostrar nomes ou locais diferentes para alguns dos elementos da interface do usuário do Visual Studio nas instruções a seguir. A edição do Visual Studio que você tem 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 Passo a passo: modelo de objeto simples e consulta (Visual Basic). Este passo a passo se baseia nisso, incluindo a presença do arquivo northwnd.mdf em c:\linqtest.

Descrição geral

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

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

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

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

Mapeando relações entre tabelas

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

Para adicionar a classe de entidade Order

  • Digite ou cole o seguinte código após a Customer classe:

    <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 do cliente

Nesta etapa, você anota a Customer classe para indicar sua relação com a Order classe. (Esta adição não é estritamente necessária, porque 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 seguinte código na Customer classe:

    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 na relação cliente-pedido

Agora você pode acessar Order objetos diretamente dos Customer objetos ou na ordem oposta. Você não precisa de uma junção explícita entre clientes e pedidos.

Para acessar objetos Order usando objetos Customer

  1. Modifique o Sub Main método 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 parar a depuração.

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

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

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

Para digitar fortemente o objeto DataContext

  1. Adicione o seguinte código acima da declaração de Customer classe.

    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 fortemente tipado DataContext 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 quiser salvar este aplicativo.

Passos Seguintes

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 as duas instruções passo a passo nesta série que você já concluiu.

Consulte também