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)
O resultado do código é:
{
// 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 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
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)
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.
{
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();
}
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.
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();
}
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" ?>
Código utilizado para trazer os livros cuja linguagem seja vb:
<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>
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();
}
}
}
Como conclusão podemos observar que o LINQ é uma linguagem que permite uma uniformidade para acessar dados em diversas fontes de informações.