VB.NET 2008 - Apresentando LINQ To SQL


No artigo VB 2008 - Apresentando LINQ - Language Integrated Query  apresentei o novo recurso da plataforma .NET (.NET Framework 3.5) chamado LINQ.

Até o momento, há cinco formas principais nas quais podemos utilizar o LINQ. (Na verdade já existem diversos 'sabores' do LINQ)

Na figura abaixo temos um esquema da estrutura do LINQ sendo que neste artigo iremos focar o LINQ To SQL.

O que LINQ To SQL ?

LINQ to SQL é uma implementação específica do LINQ para o SQL Server que converte consultas escritas em C# ou Visual Basic em SQL dinâmico , provendo uma interface que permite mapear os objetos do banco de dados gerando as classes para realizar as operações usando a sintaxe LINQ; também permite realizar alterações nos objetos e atualizar o banco de dados.

Nota: Se todos os fabricantes de banco de dados adotassem o padrão ANSI então poderíamos dizer que a LINQ To SQL poderia ser usada para todos os bancos de dados. No momento o LINQ To SQL só funciona como SQL Server. Mas a equipe do projeto LINQ esta trabalhando para que outros fornecedores de banco de dados façam a implementação para seus produtos.Vamos aguardar...(Em outro artigo irei abordar o LINQ To Entities que suporta um mapeamento mais flexível de objetos com outros bancos de dados relacionais através da extensão dos provedores ADO .NET.)

Você deve estar pensando : "Mais uma linguagem que eu tenho que aprender, por que não continuar usando SQL , por que uma nova forma de acesso a dados ????"

A primeira vista você pode estar cercado de razões mas se olharmos o cenário atual mais de perto iremos ver que o LINQ To SQL tem um forte motivo para existir.

Quando pensamos em acesso a dados na plataforma .NET pensamos em ADO .NET , certo ?

Pois bem, como fazemos atualmente para acessar os dados em um banco relacional com ADO .NET ?

Geralmente efetuamos a representação das tabelas do banco de dados em classes de forma a criar uma interface para persistência das informações.

Isso é feito hoje basicamente de duas formas:

  1. Fazer o mapeamento objeto-relacional usando DataSets e o acesso a dados através de DataAdapters ou TableAdapters com ajuda dos Assistentes de configuração;
  2. Fazer o mapeamento objeto-relacional através da criação das classes de negócio via código e acessando os dados usando DataReader;

O LINQ To SQL têm o objetivo de reunir o melhor das duas opções de forma que você possa fazer o mapeamento objeto-relacional criando classes que representam as tabelas do banco de dados (inclusive mapeando stored procedures como métodos) e com isso possibilitando a criação de consultas e alterações no banco de dados usando a sintaxe LINQ. (Na verdade as consultas criadas na 'linguagem' LINQ são convertidas em código T-SQL sendo retornado uma coleção de objetos.)

Usando LINQ To SQL

Neste exemplo vou utilizar o banco de dados Northwind.mdf e o Visual Basic 2008 Express Edition.

Abra o Visual Basic 2008 Express e crie uma nova aplicação Windows Forms com o nome minhaPrimeiraAplicacaoUsandoLINQ

No menu View e selecione DataBase Explorer e clique com o botão direito do  mouse sobre o item Data Connections e selecione Add Connection...

Na janela Add Connection Clique no botão Browse e selecione o banco de dados Northwind.mdf a partir do local onde você o instalou e clique no botão Abrir;

Agora vamos incluir a partir do menu Project->Add New Item , a partir da janela Templates, o item LINQ to SQL Classes alterando o nome para Northwind.dbml e clicando no botão Add;

Neste momento será exibida a janela do descritor Objeto Relacional. Expanda os objetos do banco de dados Northwind.mdf e selecione todas as tabelas arrastando e soltando na janela Object Relational Designer;

As tabelas do banco de dados serão mapeadas como classes (campos como propriedades, procedures e funções como métodos)  e você terá no Descritor o conjunto de classes que representam o banco de dados;

O arquivo Northwind.dbml contém o arquivo XML com informações sobre o leiaute das tabelas que foram mapeadas e também o descrito contendo as classes geradas pelo mapeamento. Após encerrar o mapeamento você já terá acesso aos recursos do LINQ To SQL com direito a intellisense completo das informações referente as tabelas mesmo sem conhecer nada sobre elas.

Vamos por o LINQ To SQL para funcionar. No formulário padrão form1.vb inclua a partir da ToolBox um componente DataGridView e um controle Button e a seguir inclua o código abaixo no evento Click do botão :

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim db As New NorthwindDataContext

DataGridView1.DataSource = From produtos In db.Products Where produtos.UnitPrice > 50 Order By produtos.ProductName Select produtos.ProductName, produtos.UnitPrice

End Sub

Compare com o código abaixo usado para preencher um DataGridView usando um DataSet.

'define a string de conexao

Dim connStr As String =  "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"


'define a instrução sql

Dim sql As String = "SELECT * FROM Products"


'define os objetos connecton, command e dataadapter

Dim conn As SqlConnection = New SqlConnection(connStr)

Dim comm As SqlCommand = New SqlCommand(sql, conn)

Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)


'define o dataset

Dim ds As DataSet = New DataSet()


Try

'---abre a conexao---

conn.Open()

'---preenche o dataset---

dataadapter.Fill(ds, "Produtos")

'---fecha a conexao---

conn.Close()

'---vincula o dataset ao DataGridView---

DataGridView1.DataSource = ds           'ou ds.tables(0)

'---define a tabela a ser exibida---

DataGridView1.DataMember = "Produtos"

Catch ex As Exception

MsgBox(ex.Message)

End Try

Executando o projeto iremos obter:

Resultado da execução do projeto usando LINQ To SQL

Note que fizemos tudo com apenas duas linhas de código.

Que diferença !!!! Então vamos entender...

Quem é responsável pela conexão e pela sincronização dos dados ????

Dim db As New NorthwindDataContext

- Aqui o banco de dados é mapeado em um DataContext permitindo acesso a tabelas de forma transparente sem nos preocuparmos com conexão. O DataContext utiliza a interface IDbConnection do ADO.NET para acessar o armazenamento e pode ser inicializado tanto com um objeto de conexão ADO.NET estabelecido ou com uma string de conexão que possa ser utilizada para criar a conexão.

O DataContext é o mecanismo usado para que seja feita a seleção no banco de dados ficando responsável por traduzir as seleções e alterações executando-as no banco de dados e transformando o resultado em objetos.

DataGridView1.DataSource = From produtos In db.Products
                                               Where
produtos.UnitPrice > 50
                                             
 Order By produtos.ProductName
                                              
Select
produtos.ProductName, produtos.UnitPrice

- A consulta LINQ To SQL inicia com a cláusula From e em seguida o operador de condição Where depois ordenação com Order By e, no final o operador de seleção Select.

Um dos motivos desta inversão de ordens é  o uso recurso IntelliSense, pois quando você indica primeiro a origem dos dados ele pode mostrar as listas de membros de tipos nos objetos em sua coleção. Outro motivo , segundo Anders Hejlsberg , seria que esta ordem esta mais próxima da nossa lógica de pensamento. Quando você digita uma instrução SQL iniciando com Select na verdade você já esta pensando na origem dos dados , condições , agrupamentos. etc.

A cláusula From é a mais importante do LINQ To SQL pois é usada em todas as consultas. Uma consulta deve sempre começar com From. (O Select pode estar implícito o From não.)

Este código define a variável produtos do tipo Product, note que o compilador esta inferindo o tipo da variável pois ela não foi declarada no código.

Este é um dos novos recursos do .NET Framework 3.5 , a inferência de tipos, que ocorre quando não há declaração explícita do tipo do objeto e o compilador descobre e atribui o tipo correto ao objeto declarado; é o que acontece neste caso.

Podemos também efetuamos consultas usando os relacionamentos entre as tabelas mapeadas com LINQ To SQL. No exemplo a seguir iremos obter os pedidos dos clientes do Brasil.

Inclua um novo componente DataGridView e um novo controle Button no formulário e inclua o seguinte código no evento Click deste segundo botão de comando:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click


Dim
db As New
NorthwindDataContext


DataGridView2.DataSource =      From c In db.Customers _

                                               From o In db.Orders _

                                                          Where c.CustomerID = o.CustomerID _

                                                          And c.Country = "Brazil" _

                                                          Order By c.CustomerID _

                                                          Select c.CustomerID, o.OrderID, o.ShipCity

End Sub

 

Note que estamos usando duas cláusulas From , uma para a tabela Customers alias c e outra para tabela Orders alias o, e efetuando a vinculação pelo código do cliente (CustomerID) que é a chave de relacionamento entre as tabelas.

No próximo artigo irei abordar como podemos efetuar alterações usando LINQ To SQL. Aguarde que vem muito mais por ai...

Até o próximo artigo VB .NET 

Referências:


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 

   Gostou ?   Compartilhe no Facebook    Compartilhe no Twitter

Referências:


José Carlos Macoratti