.NET 2008 - Um pouquinho mais sobre LINQ
O LINQ é um dos recursos da nova versão da plataforma .NET a 3.5 e oferece diversas possibilidades de uso e com certeza irá mudar a maneira como manipulamos muitos recursos como banco de dados, XML , objetos, etc. Dependendo do recurso temos uma versão do LINQ que pode ser usada. Assim temos : LINQ to Objects, LINQ to XML, LINQ to SQL, LINQ to DataSets , LINQ To Entities, etc.
O diagrama abaixo apresenta uma visão geral do LINQ , seus provedores e as fontes de dados acessíveis:
Para termos uma idéia vamos fazer uma comparação :
O trecho de código abaixo tem o objetivo de abrir uma conexão com um banco de dados e retornar alguns dados usando um DataReader.
VB .NET |
Using
connection as New SqlConnection("...")) connection.Open() Dim command As SqlCommand = connection.CreateCommand() command.CommandText = "SELECT Nome, Endereco FROM Customers WHERE Cidade = @Cidade" command.Parameters.AddWithValue("@Cidade", "Paris") Using reader as SqlDataReader = command.ExecuteReader(....) While reader.Read() Dim nome As String = reader.GetString(0) Dim endereco As String = reader.GetString(1) ... End While End Using End Using |
C# |
using
(SqlConnection connection = new
SqlConnection("...")) { connection.Open(); SqlCommand command = connection.CreateCommand(); command.CommandText = @"SELECT Nome, Endereco FROM Customers WHERE Cidade = @Cidade"; command.Parameters.AddWithValue("@Cidade", "Paris"); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { string nome = reader.GetString(0); string endereco = reader.GetString(1); ... } } } |
Olhando de relance o código acima podemos listar diversas limitações :
1- Para uma tarefa simples temos que efetuar diversos passos com muito código;
2- A consulta SQL é passada como uma string e somente será verificada em tempo de execução. Se qualquer informação da string estiver incorreta (nome da coluna, nome do campo, etc.) ocorrerá um erro;
3- Os parâmetros , da mesma forma , somente serão verificados em tempo de execução;
4- O resultado obtido não garante que o tipo de dados esteja correto. (reader.GetString(0) é mesmo uma string ?);
5- As classes usada no código são validas apenas para o SQL Server e não podem ser usadas com outro servidor de banco de dados;
Embora já existam outras soluções para contornar os problemas citados elas possuem limitações em sua implementação e resultado final.
Esta é a deixa para o LINQ entrar em cena com, ele podemos solucionar os problemas relacionados de uma forma simples e rápida visto que esta integrado ao Visual Studio, esta integrado a linguagem usada (VB .NET e C#) , efetua a verificação em tempo de compilação, usa o recurso do Intellessense, é refatorável e typesafe.
Além disso podemos relacionar outras vantagens:(http://msdn.microsoft.com/pt-br/library/bb531268.aspx)
Além disso o LINQ é muito flexível podendo ser usado nas mais diversas situações. Vejamos um exemplo:
Que tal usar o LINQ para encontrar documentos na pasta Meus Documentos ? Isso mesmo !!!!
Pois então abra o Visual Basic 2008 Express Edition e crie um projeto do tipo Windows Application com o nome LINQ_buscaMeusDocumentos (ou algo mais sugestivo);
No formulário padrão inclua um controle ListBox e um botão de comando :
Declare os seguintes namespaces:
Imports System.Linq
Imports System.IO
A seguir no
evento Click do botão de comando inclua o código abaixo:
Private Sub
Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click localizarDocumentos() End Sub |
Defina o código da rotina localizarDocumentos() :
Private Sub localizarDocumentos() Dim pastaDocumentos = My.Computer.FileSystem.SpecialDirectories.MyDocuments Dim documentos = From d In New DirectoryInfo(pastaDocumentos).GetFiles() _ Where d.Extension = ".txt" _ Order By d.Name Select d.Name, d.Extension ListBox1.Items.Add("Meu Documento esta localizado em: " & pastaDocumentos) For Each Item In documentos ListBox1.Items.Add("Nome Documento: " & Item.Name & ".") Next End Sub |
Estamos nos valendo do recurso de que a pasta Meus Documentos é uma das pastas do Windows conhecidas como pasta especial. Usando a classe System.IO definimos a localização da busca nesta pasta:
Dim pastaDocumentos =
My.Computer.FileSystem.SpecialDirectories.MyDocuments
Em seguida criamos a consulta
LINQ que usa o método GetFiles() para obter os arquivos com
extensão .txt :
Dim documentos = From d In
New DirectoryInfo(pastaDocumentos).GetFiles() _
Where d.Extension = ".txt" _
Order
By d.Name Select d.Name, d.Extension
Ao término exibimos o resultado no ListBox:
Eu deixo como um exercício melhorar a interface e otimizar a busca permitindo a seleção do tipo de documento.
Pegue o projeto completo aqui: LINQ_buscaMeusDocumentos.zip
Se você pretende saber mais sobre LINQ eu relaciono abaixo diversos links que você pode consultar:
Eu sei , é apenas LINQ , mas eu gosto...
Referências:
José Carlos Macoratti