Desenvolvimento - ASP. NET

Linq to All

Este artigo aborda as definições de Linq e da uma visão geral do que se trata tal tecnologia.

por Leonardo Bruno Bentes Lima



Objetivos: Abordar as definições de Linq e dar uma visão geral do que se trata tal tecnologia.

Aplica-se a: Visual Studio Orcas Beta1.

Muito tem se comentado sobre o Linq, DLinq, Linq over Object, Linq to XML, Linq to Entities e Linq to DataSet. É óbvio que o sujeito que não está acompanhando a evolução da plataforma .Net vai ficar em algum lugar no espaço sem saber onde. Devo admitir que no início também fiquei meio perdido, é muita coisa para absorver, quanto mais dominar.

O colega Israel Aéce iniciou uma série de matérias sobre Linq, começando das estruturas básicas (VB9, C# 3.0 e Framework 3.5) para que fique mais fácil entender os porquês da estrutura e sintaxe do Linq. Mas de que Linq a gente está falando? Linq é uma coisa só? O que é DLinq? Linq to Entities? Se existe o Linq, para uma nova versão do ADO.NET, já que eu posso trabalhar diretamente com os meus objetos?

Vamos começar explicando o que é o Linq. Segundo a definição da Microsoft (adaptei um pouco), Linq é um conjunto de extensões do .Net Framework, bem como das novas linguagens (VB9 e C#) que provêem novas capacidades dentro um ambiente de programação para executar queries em dados armazenados na memória ou em um repositório de dados externo, como um SGBD ou arquivo XML.

Transformando em uma linguagem mais prática, é uma tecnologia que nos permite abstrair a sintaxe SQL (no caso de pesquisa em BD) e ao mesmo tempo unificar a sintaxe de pesquisas nos mais diversos meios de armazenamento de informações como: Arrays, XML, etc.

A Microsoft então, diferenciou o Linq de acordo com o tipo de dado onde ele vai realizar pesquisa, daí surgiram os nomes:

- Linq to XML ou XLinq: É a utilização do Linq para realizar pesquisas em uma estrutura XML, seja ele in-line ou de um arquivo armazenado no disco;

Exemplo:

XElement contacts = XElement.Load(@"c:\ContactList.xml");

<contact>

<name>Patrick Hines</name>

<phone>206-555-0144</phone>

<phone>425-555-0145</phone>

</contact>

foreach (c in contacts.Nodes().OfType<XElement>())

{

Console.WriteLine(c);

}

- Linq to DataSet ou Linq over ADO.NET DataSet: Utilização do Linq para realizar pesquisas em DataSets tipados ou não, permitindo inclusive realizar pesquisas em mais de uma tabela do DataSet;

Exemplo:

DataAdapter.Fill(dsContact);

var qContact = dsContact.ToQueryable();

var ActiveContacts = from c in qContact

where c.field<bool>("Active") == true

select c

- Linq to Objects ou Linq over in-memory objects: É Linq fazendo pesquisas em objetos que estão na memória, localizados em coleções como uma List<> genérica;

Exemplo:

int n[] = new int[] {1, 2, 3, 5, 6, 7, 8, 9, 0};

var r = from p in n

where p < 4

select p

- Linq to SQL ou DLinq: Eu escrevi "ou", mas na verdade o termo atual é "Linq to SQL", e é a implementação do Linq para banco de dados SQL Server. Ele provê uma interface que nos permite realizar o mapeamento dos objetos do banco de dados (SQL Server somente) e gerar as classes necessárias para que utilizando a sintaxe Linq possamos realizar as operações no banco de dados;

Exemplo:

dcNorthwind dc = new dcNorthwind();

var contacts = from c in dc.Contacts

where c.Id > 10

select c

- Linq to Entities: Antes de falar sobre ele, preciso explicar o que é ADO.NET Entity Framework;

Paralelamente ao desenvolvimento do Linq, a Microsoft está trabalhando na próxima versão do ADO.NET, chamada também de ADO.NET vNext, onde a principal feature é o ADO.NET Entity Framework. O ADO.NET Entity Framework nos permite criar uma visão do BD de acordo com a nossa necessidade, permitindo carregar essa visão quando necessário devido ao fato de ele armazenar as informações em XML (SDL - Schema Description Language). Existe também uma ferramenta que pode gerar as classes de acordo com o EDM Schema (EDM Wizard e EDM Designer) gerado e a partir dessas classes (Partial Classes) podemos realizar as queries através de uma linguagem própria chamada Entity SQL ou através do Linq to Entity. Portanto, a definição de Linq to Entity é a utilização do Linq para realizar queries no ambiente do ADO.NET Entity Framework. Para mais detalhes: http://msdn2.microsoft.com/en-us/library/aa697427(vs.80,d=printer).aspx

Outra dúvida que surge é em relação à diferença entre Linq to SQL e Linq to Entities. A diferença mais óbvia é a que o Linq to SQL é voltado apenas para o SQL Server e o Linq to Entities é mais flexível, já que está ligado ao ADO.NET Entity Framework. Mas existem outras características do ADO.NET Entity Framework que pode fazer você decidir por ele ao invés do Linq to SQL.

O ADO.NET Entity Framework nos permite interferir no mapeamento feito em relação a um schema de BD existente, como por exemplo: mapear uma classe para múltiplas tabelas, modelar relacionamentos Many to Many, utilizar a linguagem Entity SQL, realização de queries sem materialização de objetos, etc, etc e etc.

Resumindo, eu considero o Linq na verdade uma única e grande tecnologia que é resultado de várias outras novidades de linguagem e de ambiente, onde um dos principais objetivos é abstrair as operações realizadas em cada fonte de dados, mas considero importante entender embora tenhamos uma sintaxe unificada, existem mecanismos diferenciados (internamente) para realizar as operações com XML, Objetos em memória e BDs.

Deixo uma pergunta: Depois de conhecer o Linq, você ainda vai querer utilizar o ADO.NET explicitamente?

Abraço e até a próxima.

Leonardo Bruno Bentes Lima

Leonardo Bruno Bentes Lima - Microsoft Most Valuable Professional, consultor em tecnologia .NET. Possui ampla experiência no desenvolvimento e analise de sistemas, dos quais 6 anos na plataforma .Net. Palestrante em diversos eventos sobre tecnologia .NET no Brasil e exterior. Atualmente trabalha Ivia informática (www.ivia.com.br).