Passo a passo: Consultando entre relacionamentos (C#)
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 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.
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 asCustomer
classes eOrder
.Criação e execução de uma consulta para testar a obtenção
Order
de informações usando aCustomer
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 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
Customer
classe:[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 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 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 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
Modifique o
Main
método 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); }
Pressione F5 para depurar seu aplicativo.
Nota
Você pode eliminar o código SQL na janela Console comentando .
db.Log = Console.Out;
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 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
Adicione o seguinte código acima da declaração de
Customer
classe.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) { } }
Modifique o
Main
método 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={0}", custObj.CustomerID); } // Freeze the console window. Console.ReadLine();
Pressione F5 para depurar seu aplicativo.
A saída da janela Console é:
ID=WHITC
Pressione Enter na janela do console para interromper a depuração.
Passos Seguintes
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 as duas instruções passo a passo nesta série que você já concluiu.