Tipos de LINQ

O LINQ é um modelo de programação que introduz a consulta e manipulação de dados dentro do conceito da linguagem .NET. Entretanto o suporte completo ao LINQ requer algumas extensões na linguagem utilizada.

O código abaixo exibe um exemplo de utilização do LINQ para fazer uma consulta na tabela Customers da base de dados Northwind.

        static void Main(string[] args)
        {
            // DataContext utiliza a connectionstring
            NorthwindDataContext db = new NorthwindDataContext();

            // Seleciona a tabela para executar a consulta
            Table<Customer> Customers = db.GetTable<Customer>();

            //Consulta clientes da cidade London
            var query =
                from cust in Customers
                where cust.City == "London"
                select cust;

            Console.WriteLine("Empresa".PadRight(25) + "Nome".PadRight(25) + "Cidade");
            foreach (var customer in query)
                Console.WriteLine("{0}{1}{2}", customer.CompanyName.PadRight(25),
                    customer.ContactName.PadRight(25), customer.City);
            Console.ReadKey();

        }
O resultado do código é:

Capture1
O código traz os dados de todos os Customers cuja cidade seja “London”. A consulta foi feita em uma Base de Dados SQL, mas a mesma consulta poderia ser utilizada se Customer fosse uma tabela em um DataSet ou uma classe que descreve uma tabela.

Um outro aspecto importante da integração da linguagem é a checagem de tipo. A sintaxe das expressões de consulta não tem o compromisso da checagem de tipo, pois os dados são sempre fortemente tipados, incluindo as consultas de coleções ou entidades que são lidas ou retornadas.
Atualmente existem os seguintes tipos de LINQ:
  • LINQ to Objects
  • LINQ to ADO.NET que inclui LINQ to SQL, LINQ to Dataset e LINQ to Entities
  • LINQ to XML
Cada uma destas implementações é definida através de um conjunto de extensões de métodos que implementam os operadores necessários para que o LINQ rode com uma fonte de dados particular. O acesso destas características é controlado por Namespaces.

LINQ to Objects
O LINQ to Object tem o objetivo de manipular coleções de objetos, que podem estar relacionados entre si de forma hierarquica ou gráfica. O LINQ to Object não está limitado a coleções de dados gerados pelo usuário. Como exemplo segue uma consulta de todos os arquivos que estão localizados no diretório temporário maiores de 500KB ordenados de forma decrescente:
        static void Main(string[] args)
        {
            string tempPath = Path.GetTempPath();
            DirectoryInfo dirInfo = new DirectoryInfo(tempPath);

            var query =
                from f in dirInfo.GetFiles()
                where f.Length > 500000 // Arquivos maior que 500K
                orderby f.Length descending
                select f;

            foreach (var arq in query)
                Console.WriteLine("Name = {0}", arq.Name);

            Console.ReadKey();
        }

O resultado do código acima é similar a figura abaixo. O resultado vai depender do conteúdo existente no diretório temporário da máquina que está sendo utilizada.
image
LINQ to ADO.NET
O LINQ to ADO.NET inclui diferentes implementações que compartilham da necessidade de manipular dados relacionais.
  • LINQ to SQL: é um componente do projeto LINQ que tem a capacidade de executar consultas em uma Base de Dados relacional.
  • LINQ to Entities: É muito similar ao LINQ TO SQL, entretanto ao invés de usar uma Base de Dados física como uma camada de persistência, ele usa uma entidade conceitual o EDM (Entity Data Model). O resultado da abstração é uma camada independente da camada de dados física.
  • LINQ to DataSet: Permite fazer consulta em um DataSet.
O código abaixo exemplifica uma consulta feita em um dataset tipado utilizando o LINQ to Dataset:
        static void Main(string[] args)
        {
            // Inicializa o TableAdapter da base de dados Northwind
            dsNorthwindTableAdapters.OrdersTableAdapter taNorthwind =
                new dsNorthwindTableAdapters.OrdersTableAdapter();

            // Declaração do DataSet Tipado da base de dados Northwind
            dsNorthwind ds = new dsNorthwind();
            taNorthwind.Fill(ds.Orders);

            // Consulta que traz o Id e a data do pedido para pedidos
            // com data superior a 01/01/1998
            var query = from o in ds.Orders
                        where o.OrderDate >= new DateTime(1998, 01, 01)
                        select new { o.OrderID, o.OrderDate };

            Console.WriteLine("Id do Pedido\t" + "Data do Pedido");

            foreach (var order in query)
            {
                Console.WriteLine("{0}\t\t{1}", order.OrderID,
                    order.OrderDate);
            }

            Console.ReadKey();           
        }

LINQ to XML
O LINQ to XML oferece uma sintaxe um pouco diferente para operar com dados em XML, permitindo consulta e manipulação de dados.

O código abaixo exemplifica uma busca no arquivo XML que possui informações sobre uma coleção de livros.

Arquivo Xml utilizado como fonte da busca:
<?xml version="1.0" encoding="utf-8" ?>
<livros>
  <livro linguagem="csharp">
    <titulo>Introducao ao CSharp</titulo>
    <autor>Antonio Dias</autor>
    <ano>2002</ano>
  </livro>
  <livro linguagem="vb">
    <titulo>Introducao ao Visual Basic</titulo>
    <autor>Marcelo Gomes</autor>
    <ano>2005</ano>
  </livro>
  <livro linguagem="csharp">
    <titulo>CSharp Avancado</titulo>
    <autor>Jose Maria</autor>
    <ano>2008</ano>
  </livro>
</livros>
Código utilizado para trazer os livros cuja linguagem seja vb:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Carrega o arquivo Xml
            XElement root = XElement.Load("livros.xml");
            // Faz uma busca nos livros cujo atributo linguagem seja vb
            IEnumerable<XElement> linguagem =
                from el in root.Elements("livro")
                where (string)el.Attribute("linguagem") == "vb"
                select el;
            // Exibe o resultado da pesquisa
            foreach (XElement el in linguagem)
                Console.WriteLine(el);

            Console.ReadKey();           
        }
    }
}
Resultado obtido:
image
Como conclusão podemos observar que o LINQ é uma linguagem que permite uma uniformidade para acessar dados em diversas fontes de informações.