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

Index

Core Microsoft LINQ Sites

Official Microsoft Flavors of LINQ

LINQ Providers

LINQ and Other Languages

Blogs and More LINQ Links

Third Party LINQ Books and Documents

Eu sei , é apenas LINQ , mas eu gosto...

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