De que se trata o artigo

Este artigo procura apresentar, de maneira introdutória, como o recurso do .NET Framework conhecido como LINQ To Objects pode ser empregado na manipulação de coleções de objetos, utilizando-se para isto queries escritas em C#. Language-Integrated Query (LINQ) é um recurso do framework .NET que possibilita, basicamente, a execução de consultas (queries) sobre agrupamentos de dados. Tais agrupamentos podem ser coleções de objetos, entidades correspondentes a estruturas de dados de um banco SQL Server, documentos XML ou, ainda, Datasets obtidos através das classes de acesso a dados do ADO.NET. A execução destas consultas busca, normalmente, filtrar um conjunto mais reduzido de itens ou, ainda, gerar novas informações a partir da fonte de dados original. Queries em LINQ podem ser escritas empregando sintaxe C# ou VB.NET. LINQ to Objects, por sua vez, é um mecanismo que possibilita a execução de tais tipos de queries em listas ou arrays, sendo que tais coleções contêm um conjunto de itens de um determinado tipo.


Em que situação o tema é útil

Manipular agrupamentos de um determinado tipo de objeto ou dado representa, via de regra, um tipo de atividade bastante comum durante o desenvolvimento de aplicações de software. Tal atividade destina-se, em geral, à obtenção de um ou mais itens dentro de uma coleção ou, mesmo, à geração de novas informações como somatórios, por exemplo.

LINQ to Objects - Utilizando LINQ para manipular coleções de objetos

Consumir informações de coleções contendo objetos é, de modo geral, um tipo de ocorrência bem frequente durante o desenvolvimento em .NET. Um meio bastante disseminado para resolver este tipo de demanda consiste, basicamente, no uso de estruturas de repetição (while, for, foreach) e de decisão (if, if-else), em conjunto com a declaração de diversas variáveis para estabelecer alguma forma de controle. O uso do mecanismo conhecido como LINQ to Objects procura simplificar este tipo de atividade, economizando esforços dos desenvolvedores e flexibilizando a maneira de se tratar agrupamentos de objetos.

Procurando oferecer alternativas para simplificar o cotidiano dos desenvolvedores, o framework .NET conta desde a versão 3.5 (utilizada em conjunto com o Visual Studio 2008) com o mecanismo conhecido como Language-Integrated Query (LINQ). Trata-se de um recurso que permite a construção de consultas (queries) em C# ou VB.NET, numa abordagem similar àquela adotada pela linguagem SQL ou, ainda, num padrão mais convencional para linguagens orientadas a objetos (através da invocação na sequência de um conjunto de métodos específicos).

Assim como acontece com outras construções de código tais como declarações de variáveis ou invocações de métodos, o IntelliSense do Visual Studio oferece também pleno suporte para a utilização de código escrito em LINQ. Já diferentemente do que acontece ao se empregar instruções SQL no código, uma das principais vantagens de se utilizar LINQ está no suporte que o compilador do .NET Framework oferece para este tipo de recurso; caso se opte por acessar uma base de dados SQL Server via LINQ, prováveis erros de sintaxe numa consulta são diagnosticados durante o desenvolvimento, algo que através de SQL somente seria observado em tempo de execução da aplicação em questão.

O uso de LINQ sobre agrupamentos de dados torna possível, com menor esforço por parte de quem está programando, operações como: seleção de todo um agrupamento de dados ou, ainda, de parte deste (neste caso, mediante alguma condição que restrinja os valores a serem retornados); projeções, nas quais utilizam-se apenas algumas das informações pertencentes a um conjunto de objetos; ordenação de um agrupamento de itens de acordo com algum critério específico; novos agrupamentos, aplicando-se para isto funcionalidades de contagem, soma, média, mínimo e máximo.

A meta deste artigo é abordar a utilização de LINQ to Objects no desenvolvimento de soluções dentro da plataforma .NET. Para isto serão demonstrados alguns exemplos de consultas sobre uma coleção de objetos, bem como discutidos alguns conceitos acerca do uso deste tipo de recurso.

Tipos de implementações de LINQ

Procurando atender a uma ampla gama de necessidades, o .NET Framework disponibiliza diversas implementações para a utilização de LINQ:

• LINQ to Objects;

• LINQ to XML;

• LINQ to SQL;

• LINQ to Dataset;

• LINQ to Entities.

LINQ to Objects é um recurso que permite a construção de consultas para a manipulação de coleções de objetos. Isto dispensa os desenvolvedores da necessidade de se utilizarem loops complexos, com uma lógica envolvendo estruturas condicionais (if, if-else) e de repetição (for, foreach, while), bem como evita a declaração de uma série de variáveis a fim de se cumprir tal objetivo. Importante frisar que consultas escritas em LINQ to Objects podem ser aplicadas em qualquer coleção que implemente as interfaces IEnumerable e / ou IEnumerable<T>, em que T é qualquer tipo válido dentro do .NET Framework.

A extensão LINQ to XML é empregada na manipulação de dados no formato XML, disponibilizando uma série de recursos a fim de simplificar operações que envolvam a escrita e a leitura de informações em XML.

Já a implementação LINQ to SQL permite que se realizem consultas em base de dados, valendo-se para isto do uso de classes geradas a partir de um modelo visual disponibilizado pelo Visual Studio. Graças a estas características, este mecanismo elimina a necessidade de escrita de strings com comandos SQL, beneficiando-se com isso do suporte que o Visual Studio oferece para o uso de LINQ durante a construção de uma aplicação (IntelliSense e verificação de erros antes da compilação). A plataforma .NET oferece suporte nativo para o acesso a SQL Server através de LINQ, sendo que outros fornecedores também disponibilizam soluções proprietárias para o uso de outros tipos de bancos de dados.

Com a extensão LINQ to Dataset torna-se possível a execução de queries sobre os dados contidos em Datasets. Um Dataset é geralmente obtido via classes de acesso a dados do ADO.NET, representando em memória estruturas (tabelas ou visões) existentes em uma base de dados.

O recurso conhecido como LINQ to Entities é a base para a utilização do Entity Framework. Este último, por sua vez, nada mais é do que um mecanismo de mapeamento objeto-relacional (ORM) que a plataforma .NET disponibiliza para a utilização de bancos de dados. Através do Entity Framework, estruturas de dados são representadas sob a forma de classes, sendo que consultas a um banco de dados são realizadas por meio de queries escritas em LINQ.

Nota do DevMan

Frameworks ORM (do inglês Object-relational mapping - ou Mapeamento objeto relacional) permitem a representação de estruturas de bancos de dados sob a forma de classes. Esta prática tem por objetivo simplificar o desenvolvimento de aplicações que façam uso de bases de dados, desonerando os programadores da necessidade de escrever toda uma lógica que porte informações no formato relacional para o correspondente num modelo orientado a objetos. Além do Entity Framework e da extensão LINQ to SQL, o NHibernate é um outro exemplo deste tipo framework.

Efetuando consultas com LINQ to Objects

Existem duas sintaxes possíveis para a construção de consultas empregando LINQ to Objects:

• Uma sintaxe de escrita de queries, em um modo similar àquele utilizado com a linguagem SQL;

• A outra possibilidade é baseada no uso de métodos que substituem as construções da sintaxe baseada em queries.

...
Quer ler esse conteúdo completo? Tenha acesso completo