Compartilhar via


Passo a passo: consultar entre relações (C#)

Esse passo a passo demonstra o uso das associações do LINQ to SQL para representar relações 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.

Esse passo a passo foi escrito usando as configurações de desenvolvimento do Visual C#.

Pré-requisitos

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

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 a 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 Order.Customer se relaciona como uma chave estrangeira a Customer.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 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 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 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 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 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 do console comentando por db.Log = Console.Out;.

  3. Pressione Enter na janela de Console para parar 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 : 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 DataContext fortemente tipado 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={0}", 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 de Console para parar a depuração.

Próximas etapas

O próximo passo a passo (Passo a passo: Manipulando dados (C#)) 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