.NET - Programando com LINQ To SQL
Em meus artigos anteriores sobre LINQ to SQL eu mostrei como criar os objetos e como usar o mapeamento ORM usando o descritor LINQ, podemos entretanto obter o mesmo resultado via código, se você é daqueles que adora codificar você vai adorar...
Neste artigo eu mostro como efetuar o mapeamento objeto relacional ,criar um contexto de dados (datacontext) e consultar um banco de dados SQL Server com LINQ To SQL via código sem a ajuda do descritor Visual LINQ.
Material necessário:
1- Visual Basic 2008 Express Editon
ou Visual Studio 2008
2- Banco de dados Northwind.mdf
3- SQL Server 2005 Express
Mapeando classes para Tabelas
O conceito de mapeamento objeto Relacional (ORM) não é uma novidade. Um ORM pode ser visto como um classe (entidade) que possui propriedades ou campos que mapeiam para as colunas de um banco de dados.
O mapeamento para uma tabela possui dois elementos básicos:
Para mapear a classe para uma tabela usamos o TableAttribute com argumentos nomeados para associar a classe com a tabela.
Abra o Visual Basic 2008 Express e crie um novo projeto do tipo Windows Application com o nome vbn8_ORM
A seguir inclua uma referência ao LINQ To SQL clicando com o botão direito sobre o nome do projeto e selecionando Add Reference;
A seguir na janela Add Reference selecione, na aba .NET, System.Data.Linq e clique no botão OK;
Com isso já temos tudo pronto para iniciar o projeto.
Nosso objetivo será efetuar o mapeamento objeto relacional com as tabelas Orders e Order Details do banco de dados Northwind.mdf.
Podemos visualizar o relacionamento existente entre as duas tabelas no DataBase Diagram:
No menu Project | Add New Item selecione o template Class e informe o nome ORM.vb. Nesta classe iremos definir o mapeamento entre as tabelas do banco de dados.
Abra a classe e inclua a seguinte declaração :
Imports
System.Data.linq
Imports System.Data.Linq.Mapping
Agora inclua o seguinte código que irá criar o mapeamento para
as tabelas Orders e Order Details para
os campos definidos:
Imports System.Data.linq Imports System.Data.Linq.Mapping Public Class ORM <Table(Name:="Orders")> Public Class Pedido <Column()> Public OrderID As Integer <Column()> Public CustomerID As String <Column()> Public EmployeeID As Integer <Column()> Public OrderDate As DateTime <Column()> Public ShipCity As String End Class <Table(Name:="Order Details")> Public Class DetalhesPedido <Column()> Public OrderID As Integer <Column()> Public ProductID As Integer <Column()> Public UnitPrice As Decimal <Column()> Public Quantity As Int16 <Column()> Public Discount As Single End Class End Class |
O código acima cria as classes Pedido e DetalhesPedido mapeando para as tabelas Orders e Order Details e define as colunas que devem ser mapeadas.
Abra o arquivo form1.vb e inclua um controle ListBox e um controle Button conforme o leiaute abaixo:
No evento Click do botão de comando inclua o código a seguir:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim strConexao As String = My.Settings.NORTHWNDConnectionString 'define o dataContext para cada uma das Tabelas Dim OrderContext As DataContext = New DataContext(strConexao) Dim OrderDetailsContext As DataContext = New DataContext(strConexao) 'Efetua a vinculação com cada contexto Dim pedidos As Table(Of ORM.Pedido) = OrderContext.GetTable(Of ORM.Pedido)() Dim detalhesPedidos As Table(Of ORM.PedidosDetalhes) = OrderDetailsContext.GetTable(Of ORM.PedidosDetalhes)() 'define uma instrução LINQ To SQL para obter informações da classe detalhesPedidos Dim todosDetalhes = From detalhe In detalhesPedidos _ Select detalhe 'percorre o resultado e exibe os valores no listbox For Each d In todosDetalhes ListBox1.Items.Add(d.ProductID + " - " + d.UnitPrice) Next End Sub |
Note que você não precisou se preocupar com os detalhes da conexão e nem precisou usar os objetos de acesso a dados da ADO .NET a criação do DataContext tornou essa fase do projeto transparente para você.
Executando o projeto iremos obter:
Concluímos que o LINQ To SQL pode ser uma ferramenta valiosa para popular classes de entidades sem usar connections nem datareaders; além disso é totalmente compatível com ADO .NET 2.0.
Tudo o que você precisou fazer foi definir as entidades para mapeamento e definir um DataContext para obter os dados.
Mas não se iluda, o LINQ To SQL cria uma nova camada na sua aplicação e a sua utilização ou não deve ser ponderada com uma análise criteriosa do seu projeto.
Pegue o projeto completo aqui : vbn8_ORM1.zip
Referências:
José Carlos Macoratti