LINQ - C#
O tópico de hoje é LINQ, uma implementação que pode adicionar funcionalidades de consulta ao framework .NET.
O LINQ é implementado sobre uma interface IEnumerable, o que permite que sejam realizadas consultas de vários tipos como consulta SQL por exemplo, desde que um framework como Entity Framework, LinqTo SQL ou NHibernate seja usado.
LINQ abrange vários tópicos, se você quiser acessar a documentação do .NET vai ver que existem várias possibilidades, então hoje vou trazer uma visão mais superficial do uso e um pouquinho sobre Entity Framework também.
O recurso LINQ permite que consultas complexas sejam feitas de uma forma bem mais simples, sem uma preocupação tão grande com a extração dos dados. A estrutura de busca é parecida com a estrutura SQL, em bancos de dados relacionais.
A plataforma .NET permite que o LINQ seja usado para consultas de Arrays, coleções, documentos XML e banco de dados de uma forma bem parecida, o que facilita na hora do desenvolvimento.
Como os recursos LINQ tem um nível maior de abstração, existem alguns casos onde é mais interessante realizar as consultas de banco diretamente em SQL, as consultas feitas indiretamente com LINQ tendem a não ser tão performáticas... Existem alguns casos onde essa pequena diferença de performance é relevante, então uma possível alternativa é que o sistema use LINQ e consultas diretas combinadas de acordo com a necessidade. Caso a base seja muito robusta, o uso de queries SQL pode ser indicado pela questão de performance.
Para que as consultas SQL possam ser feitas, como mencionado a cima, é necessário um framework como Entity Framework, LinqTo SQL ou NHibernate. O uso de Entity Framework é bastante comum entre profissionais que desenvolvem em C# .NET, mesmo sem saber que é uma implementação LINQ… O Entity Framework é um conjunto de tecnologias que suporta o desenvolvimento de aplicações orientadas a dado com um nível de abstração mais elevado, o que significa que é possível manipular dados de um banco de dados através do framework que faz um mapeamento (object-relational mapping — ORM).
Bom, como já mencionado, as ferramentas que o LINQ oferece vão desde manipulação de Arrays até consultas mais elaboradas. Por exemplo, caso você queira transformar uma string em uma lista de caracteres, em vez de fazer uma iteração com for, while ou foreach, para criar um Array de caracteres, você pode usar um IEnumerable.
Para selecionar um valor (ch) contido em um elemento da fonte de dados (getString) basta especificar o valor desejado após a palavra-chave select (ch).
Uma coisa importante de se dizer é que existem dois tipos de interface que podem ser usadas nesse contexto: IEnumerable e a IQueryable.
O José Carlos Macoratti fez uma comparação que achei bem esclarecedora e fácil de entender, onde ele aponta que o IEnumerable pertence ao namespace System.Collections, e é ideal para trabalhar com uma coleção que seja somente leitura, ler objetos como no exemplo a cima, iterar em uma coleção usando foreach e trabalhar com objetos em memória. A consulta de dados a partir de coleções em memória como List ou Array também pode ser feita usando o IEnumerable.
Já o IQueryable fica no namespace System.Linq, inclusive, quando comecei a estudar, imaginei que o IQueryable era melhor para implementação LINQ por pertencer a este namespace… oque não é necessariamente verdade. Enfim, IQueryable pode ser usado para aplicar um filtro na fonte de dados, pode ser usado para paginação, uso de uma fonte de dados externa, iteração em uma coleção e para consultas de dados a partir de coleções que não estão na memória como : banco de dados remotos ou algum serviço.
Um detalhe importante é que o IQueryable é uma herança do IEnumerable. Então vale a pena analisar com calma quando usar cada uma das implementações.
A maior vantagem em usar LINQ para a realização de consultas é a consistência do modelo de consulta, ou seja, tanto para uma consulta em Array, quanto SQL ou XML o modelo de consulta vai ter a mesma estrutura, essa abstração oferecida simplifica tanto a implementação quanto a manutenção do sistema.
O modelo LINQ consiste em três ações principais:
- Obter a fonte de dados.
- Criar a consulta.
- Executar a consulta.
Então mesmo que a fonte de dados seja diferente, a forma de consulta e manipulação de dados vai ser parecida.
A consulta LINQ não se limita apenas à recuperação de dados. Também é uma ferramenta para transformação de dados. Você pode usar uma sequência de origem como entrada e modificá-la de várias maneiras para criar uma nova sequência de saída, além disso o LINQ possibilita a criação de novos tipos. Isso é feito na cláusula select.
Por exemplo, é possível executar as seguintes tarefas:
- Mesclar várias sequências de entrada em uma única sequência de saída que tenha um novo tipo.
- Criar sequências de saída cujos elementos consistem nos resultados das operações realizadas nos dados de origem.
- Criar sequências de saída em um formato diferente. Por exemplo, você pode transformar dados de linhas do SQL ou de arquivos de texto em XML.
Todas as ações citadas a cima podem ser construídas usando outros recursos, fazendo manipulação de objetos ou até mesmo com queryes SQL, a vantagem do LINQ é que todas essas ações podem ser feitas usando uma mesma ferramenta com uma estrutura semelhante.
Na documentação .NET além dessa lista de recursos, você também pode encontrar alguns exemplos para testar a implementação.
Por hoje é isso! Espero que esse post ajude a esclarecer um pouco o tópico LINQ. 😁