Do que trata o artigo

O artigo aborda os detalhes das expressões de consulta LINQ introduzidas na plataforma .NET 3.0. Todas as cláusulas de expressões de consulta serão demonstradas com exemplos práticos em Delphi Prism XE com consultas realizadas no sistema de arquivos Windows.


Para que serve

A LINQ permite que consultas sejam realizadas em diversas fontes de dados. Sua sintaxe é similar à SQL, aproveitando assim o conhecimento adquirido do usuário. É integrada ao Visual Studio (IDE do Delphi Prism), garantindo verificação da sintaxe e IntelliSense.


Em que situação o tema é útil

O tema é útil no desenvolvimento de praticamente qualquer sistema em .NET. O domínio das expressões de consulta na linguagem Delphi Prism XE é importante no uso dos providers LINQ disponíveis, como: LINQ to Objects, LINQ to XML, LINQ to DataSet, LINQ to SQL e LINQ to Entities.

Resumo do DevMan

Após uma breve introdução à LINQ e algumas de suas diversas implementações para diversas fontes de dados, o leitor terá a oportunidade de conhecer os Standard Query Operators e a sintaxe das expressões de consulta com explicações de todas as cláusulas introduzidas na linguagem. Depois, o leitor será orientado na criação de um projeto de aplicação ASP.NET Web Application utilizando Delphi Prism XE para demonstrar todas as cláusulas das expressões de consulta LINQ, desde exemplos mais básicos até exemplos relativamente complexos.

Autores: Rodrigo Araujo e Rogério Moraes de Carvalho

Motivação para criação do LINQ

O objetivo da Microsoft com a criação da Language-Integrated Query (LINQ) foi aproximar o mundo dos objetos do mundo dos dados. A LINQ corresponde a uma sintaxe unificada, inicialmente incorporada às linguagens C# e Visual Basic (e agora também o Delphi Prism), para consultas em fontes de dados variadas. A sintaxe de consulta da LINQ foi inspirada na da Structured Query Language (SQL), que é uma linguagem padrão para comunicação com bancos de dados relacionais. Assim como na linguagem SQL, as expressões de consulta LINQ permitem a construção de instruções variadas para extração de informações.

Tradicionalmente, as consultas a bancos de dados em aplicações eram expressas por strings sem verificação de sintaxe nem em tempo de projeto e nem em tempo de compilação, além de não haver suporte ao IntelliSense (o “Code Insight” do Visual Studio). Erros de sintaxe na consulta somente eram identificados em tempo de execução. Além disto, o desenvolvedor precisava aprender linguagens de consulta específicas para cada tipo de fonte de dados, como: bancos de dados relacionais, coleções de objetos na memória, documentos XML, dentre outros tipos de fontes de dados.

Introdução da LINQ na plataforma .NET

A LINQ foi introduzida nas linguagens Visual Basic 9.0 (ou Visual Basic 2008) e C# 3.0 (Visual C# 2008), em novembro de 2007, com o .NET Framework 3.0 e o Visual Studio 2008. O Delphi Prism suporta a LINQ em suas últimas versões, incluindo 2010, 2011 / XE.

Diversos novos recursos foram introduzidos na versão 3.0 da linguagem de programação C#, e, posteriormente, com o advento do Delphi Prism, os recursos também foram introduzidos nesta linguagem sendo que grande parte deles voltados para suportar a inclusão da LINQ na linguagem. Vemos a seguir uma lista dos recursos que estão diretamente ligados com o suporte à LINQ:

• Iniciadores de objetos;

• Tipos implícitos em variáveis locais (var);

• Métodos de extensão;

• Expressões lambda;

• Árvores de expressão;

• Tipos anônimos.

• Expressões de consulta.

LINQ Providers

O padrão LINQ torna simples a consulta em fontes de dados para as quais a LINQ esteja habilitada, uma vez que a sintaxe e o padrão de consultas não muda. Um LINQ Provider para uma determinada fonte de dados permite não somente a operação de consulta, mas também operações de inclusão, atualização e exclusão, além de mapeamento para tipos definidos pelo usuário.

O .NET Framework suporta os seguintes LINQ Providers:

LINQ to Objects Componente que permite consultar coleções de objetos do tipo IEnumerable<T> diretamente.

LINQ to XML Componente que fornece uma interface de manipulação de XML em memória. Corresponde a uma interface de programação muito mais avançada e simples de manipulação XML na memória que a interface do padrão W3C Document Object Model (DOM).

LINQ to DataSet Componente que possibilita a consulta de objetos do tipo DataSet na memória.

LINQ to SQL Componente que fornece infraestrutura para gerenciar dados relacionais como objetos. Este componente permite fazer mapeamento objeto-relacional (ORM – Object-Relational Mapping), ou seja, permite mapear um modelo de dados de um banco de dados relacional para um modelo de objetos. Atualmente, a LINQ to SQL somente contém um provider para o servidor de banco de dados SQL Server, desenvolvido pela Microsoft. Como o LINQ to SQL não fornece uma boa abstração do banco de dados, não houve interesse no desenvolvimento de providers para outros bancos de dados.

LINQ to Entities, que é parte do ADO.NET Entity Framework O ADO.NET Entity Framework é um componente do .NET Framework, introduzido no .NET Framework 3.5 SP1, que, assim como a LINQ to SQL, fornece infraestrutura para gerenciar dados relacionais como objetos. Porém, ao contrário da LINQ to SQL, permite trabalhar com dados num alto nível de abstração do engine de armazenamento de dados e do esquema relacional. O Entity Framework suporta o Entity Data Model (EDM) para definição dos dados num nível conceitual. Há uma separação clara entre as informações do modelo conceitual, do modelo de armazenamento e do mapeamento entre estes dois modelos. Atualmente, o ADO.NET Entity Framework está na versão 4.0 e corresponde à principal tecnologia de mapeamento objeto-relacional suportada pela Microsoft.

Standard Query Operators

Os Standard Query Operators são métodos de extensão que formam o padrão LINQ. Eles fornecem capacidades de consulta incluindo projeção, filtragem, ordenação, agregação e outras. Existem dois conjuntos de Standard Query Operators LINQ: os que atuam em objetos do tipo System.Collections.Generic.IEnumerable<T> e os que atuam em objetos do tipo System.Linq.IQueryable<T>. Os métodos de extensão que constituem cada conjunto são definidos nas classes estáticas System.Linq.Enumerable e System.Linq.Queryable, respectivamente.

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