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:
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
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
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
NET - LINQ a seu dispor - Sintaxe e Operadores - Macoratti ...
http://www.microsoft.com/brasil/msdn/Tecnologias/arquitetura/LINQ.mspx