.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:

  1. TableAttribute - mapeia a classe para a tabela no banco de dados;
  2. ColumnAttribute - mapeia cada propriedade para uma coluna do banco de dados;

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:

  • http://www.microsoft.com/brasil/msdn/Tecnologias/arquitetura/LINQ.mspx
  • LINQ - http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx
  • 101 LINQ Samples
  • VB 2008 - Criando uma aplicação completa com LINQ To SQL - III
  • VB 2008 - Criando uma aplicação completa com LINQ To SQL - II
  • VB 2008 - Criando uma aplicação completa com LINQ To SQL - I
  • LINQ To SQL - Descritor O/R, DataContext e Stored Procedures
  • ASP .NET 2008 - LINQ To SQL - operações básicas

  • José Carlos Macoratti