Partilhar via


Passo a passo: Consultando entre relacionamentos (C#)

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

Observação

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 C#.

Pré-requisitos

Você deve ter concluído Passo a passo: Modelo de objeto simples e consulta (C#). Este passo a passo se baseia nisso, incluindo a presença do arquivo northwnd.mdf em c:\linqtest5.

Visã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 para a classe Customer para melhorar a relação entre as classes Customer e Order.

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

Mapeando relações entre tabelas

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

Para adicionar a classe de entidade 'Order'

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

    [Table(Name = "Orders")]
    public class Order
    {
        private int _OrderID = 0;
        private string _CustomerID;
        private EntityRef<Customer> _Customer;
        public Order() { this._Customer = new EntityRef<Customer>(); }
    
        [Column(Storage = "_OrderID", DbType = "Int NOT NULL IDENTITY",
        IsPrimaryKey = true, IsDbGenerated = true)]
        public int OrderID
        {
            get { return this._OrderID; }
            // No need to specify a setter because IsDBGenerated is
            // true.
        }
    
        [Column(Storage = "_CustomerID", DbType = "NChar(5)")]
        public string CustomerID
        {
            get { return this._CustomerID; }
            set { this._CustomerID = value; }
        }
    
        [Association(Storage = "_Customer", ThisKey = "CustomerID")]
        public Customer Customer
        {
            get { return this._Customer.Entity; }
            set { this._Customer.Entity = value; }
        }
    }
    

Anotando a classe do cliente

Nesta etapa, você anota a classe Customer para indicar sua relação com a classe Order. (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 Cliente

  • Digite ou cole o seguinte código na classe Customer:

    private EntitySet<Order> _Orders;
    public Customer()
    {
        this._Orders = new EntitySet<Order>();
    }
    
    [Association(Storage = "_Orders", OtherKey = "CustomerID")]
    public EntitySet<Order> Orders
    {
        get { return this._Orders; }
        set { this._Orders.Assign(value); }
    }
    

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

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

Para aceder aos objetos Order usando os objetos Customer

  1. Modifique o método Main digitando ou colando o seguinte código no método:

    // Query for customers who have placed orders.
    var custQuery =
        from cust in Customers
        where cust.Orders.Any()
        select cust;
    
    foreach (var custObj in custQuery)
    {
        Console.WriteLine("ID={0}, Qty={1}", custObj.CustomerID,
            custObj.Orders.Count);
    }
    
  2. Pressione F5 para depurar seu aplicativo.

    Observação

    Você pode eliminar o código SQL na janela Console comentando db.Log = Console.Out;.

  3. Pressione Enter na janela Console para interromper 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 tipificada do seu banco de dados. Ao digitar fortemente o objeto DataContext, você não precisa de chamadas para GetTable. Você pode usar tabelas fortemente tipadas em todas as suas consultas ao usar o objeto DataContext fortemente tipado.

Nas etapas a seguir, irá criar Customers como uma tabela com tipagem forte que mapeia para a tabela Clientes na base de dados.

Para digitar fortemente o objeto DataContext

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

    public class Northwind : DataContext
    {
        // Table<T> abstracts database details per table/data type.
        public Table<Customer> Customers;
        public Table<Order> Orders;
    
        public Northwind(string connection) : base(connection) { }
    }
    
  2. Modifique o método Main para usar o fortemente tipado DataContext da seguinte maneira:

    // Use a connection string.
    Northwind db = new Northwind(@"C:\linqtest5\northwnd.mdf");
    
    // Query for customers from Seattle.
    var custQuery =
        from cust in db.Customers
        where cust.City == "Seattle"
        select cust;
    
    foreach (var custObj in custQuery)
    {
        Console.WriteLine($"ID={custObj.CustomerID}");
    }
    // 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 do console para interromper a depuração.

Próximos passos

O próximo passo a passo (Passo a passo: Manipulando dados (C#)) demonstra como manipular dados. Este guia não requer que tu guardes os dois guias desta série que já concluíste.

Ver também