LINQ - Visão geral
Desenvolvedores em todo o mundo sempre encontraram problemas na consulta de dados por causa da falta de um caminho definido e precisam dominar várias tecnologias como SQL, Web Services, XQuery, etc.
Introduzido no Visual Studio 2008 e projetado por Anders Hejlsberg, LINQ (Language Integrated Query) permite escrever consultas mesmo sem o conhecimento de linguagens de consulta como SQL, XML etc. As consultas LINQ podem ser escritas para diversos tipos de dados.
Exemplo de consulta LINQ
C #
using System;
using System.Linq;
class Program {
static void Main() {
string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"};
//Get only short words
var shortWords = from word in words where word.Length <= 5 select word;
//Print each word out
foreach (var word in shortWords) {
Console.WriteLine(word);
}
Console.ReadLine();
}
}
VB
Module Module1
Sub Main()
Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"}
' Get only short words
Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word
' Print each word out.
For Each word In shortWords
Console.WriteLine(word)
Next
Console.ReadLine()
End Sub
End Module
Quando o código acima de C # ou VB é compilado e executado, ele produz o seguinte resultado -
hello
LINQ
world
Sintaxe de LINQ
Existem duas sintaxes de LINQ. Estes são os seguintes.
Sintaxe de Lamda (método)
var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)
Sintaxe de consulta (compreensão)
var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10
Tipos de LINQ
Os tipos de LINQ são mencionados resumidamente a seguir.
- LINQ to Objects
- LINQ to XML (XLINQ)
- LINQ para DataSet
- LINQ to SQL (DLINQ)
- LINQ to Entities
Além do acima, há também um tipo LINQ denominado PLINQ, que é o LINQ paralelo da Microsoft.
Arquitetura LINQ em .NET
LINQ tem uma arquitetura de 3 camadas na qual a camada superior consiste nas extensões de linguagem e a camada inferior consiste em fontes de dados que são normalmente objetos que implementam interfaces genéricas IEnumerable <T> ou IQueryable <T>. A arquitetura é mostrada abaixo.
Expressões de consulta
A expressão de consulta nada mais é do que uma consulta LINQ, expressa em um formato semelhante ao do SQL com operadores de consulta como Select, Where e OrderBy. As expressões de consulta geralmente começam com a palavra-chave "De".
Para acessar os operadores de consulta LINQ padrão, o namespace System.Query deve ser importado por padrão. Essas expressões são escritas em uma sintaxe de consulta declarativa que era C # 3.0.
Abaixo está um exemplo para mostrar uma operação de consulta completa que consiste na criação de fonte de dados, definição de expressão de consulta e execução de consulta.
C #
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Operators {
class LINQQueryExpressions {
static void Main() {
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery = from score in scores where score > 80 select score;
// Execute the query.
foreach (int i in scoreQuery) {
Console.Write(i + " ");
}
Console.ReadLine();
}
}
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
97 92 81
Métodos de Extensão
Introduzido com o .NET 3.5, os métodos de extensão são declarados em classes estáticas apenas e permitem a inclusão de métodos personalizados em objetos para realizar algumas operações de consulta precisas para estender uma classe sem ser um membro real dessa classe. Eles também podem estar sobrecarregados.
Em suma, os métodos de extensão são usados para traduzir expressões de consulta em chamadas de método tradicionais (orientado a objeto).
Diferença entre LINQ e procedimento armazenado
Há uma série de diferenças existentes entre LINQ e procedimentos armazenados. Essas diferenças são mencionadas a seguir.
Os procedimentos armazenados são muito mais rápidos do que uma consulta LINQ, pois seguem um plano de execução esperado.
É fácil evitar erros de tempo de execução durante a execução de uma consulta LINQ do que em comparação a um procedimento armazenado, já que o primeiro tem suporte a Intellisense do Visual Studio, bem como verificação de tipo completo durante o tempo de compilação.
O LINQ permite a depuração usando o depurador .NET, o que não ocorre no caso de procedimentos armazenados.
LINQ oferece suporte para vários bancos de dados em contraste com procedimentos armazenados, onde é essencial reescrever o código para diversos tipos de bancos de dados.
A implantação da solução baseada em LINQ é fácil e simples em comparação com a implantação de um conjunto de procedimentos armazenados.
Necessidade de LINQ
Antes do LINQ, era essencial aprender C #, SQL e várias APIs que unem os dois para formar um aplicativo completo. Desde então, essas fontes de dados e linguagens de programação enfrentam uma incompatibilidade de impedância; uma necessidade de codificação curta é sentida.
Abaixo está um exemplo de quantas técnicas diversas foram usadas pelos desenvolvedores ao consultar dados antes do advento do LINQ.
SqlConnection sqlConnection = new SqlConnection(connectString);
SqlConnection.Open();
System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText = "Select * from Customer";
return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)
Curiosamente, das linhas de código apresentadas, a consulta é definida apenas pelas duas últimas. Usando o LINQ, a mesma consulta de dados pode ser escrita em uma forma codificada por cores legível, como a seguinte, mencionada abaixo, em muito menos tempo.
Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;
Vantagens do LINQ
LINQ oferece uma série de vantagens e entre elas a mais importante é sua expressividade poderosa, que permite que os desenvolvedores se expressem declarativamente. Algumas das outras vantagens do LINQ são fornecidas abaixo.
LINQ oferece realce de sintaxe que se mostra útil para descobrir erros durante o tempo de design.
LINQ oferece IntelliSense, o que significa escrever consultas mais precisas facilmente.
Escrever códigos é muito mais rápido no LINQ e, portanto, o tempo de desenvolvimento também é reduzido significativamente.
LINQ facilita a depuração devido à sua integração na linguagem C #.
Visualizar o relacionamento entre duas tabelas é fácil com o LINQ devido ao seu recurso hierárquico e isso permite a composição de consultas unindo várias tabelas em menos tempo.
O LINQ permite o uso de uma única sintaxe LINQ ao consultar muitas fontes de dados diversas e isso se deve principalmente à sua base unitiva.
O LINQ é extensível, o que significa que é possível usar o conhecimento do LINQ para consultar novos tipos de fonte de dados.
O LINQ oferece a facilidade de juntar várias fontes de dados em uma única consulta, bem como dividir problemas complexos em um conjunto de consultas curtas fáceis de depurar.
LINQ oferece fácil transformação para conversão de um tipo de dados em outro, como transformar dados SQL em dados XML.