Neste post, vamos falar sobre o LINQ, uma das funcionalidades mais interessantes do C#. Ele foi criado com o intuito de padronizar as formas de consultas de dados. Normalmente, para acessar dados em um banco de dados relacional ou um arquivo Excel, é necessário utilizar linguagens diferentes, como SQL para bancos relacionais. O LINQ nos permite realizar todas essas consultas utilizando uma única sintaxe, diretamente com os objetos do nosso sistema.
Exemplo Prático de LINQ
Vamos aproveitar o mesmo exemplo do post anterior Integração com PostgreSQL em C# – Brabo Dev, onde termos uma lista de alunos, onde cada aluno tem uma idade, nome e curso. Aqui está um exemplo do código.
public class Aluno
{
public int Idade { get; set; }
public string Nome { get; set; }
public string Curso { get; set; }
public Aluno(int idade, string nome, string curso)
{
Idade = idade;
Nome = nome;
Curso = curso;
}
}
public class Program
{
static void Main(string[] args)
{
var alunos = new List<Aluno>()
{
new Aluno(idade: 17, nome: "João", curso: "Direito"),
new Aluno(idade: 25, nome: "Maria", curso: "Direito"),
new Aluno(idade: 35, nome: "Fernando", curso: "Sistemas de Informação"),
new Aluno(idade: 18, nome: "Pedro", curso: "Direito"),
};
}
}
Vamos fazer uma filtragem para trazer apenas os alunos que estão cursando Direito. Primeiro, mostramos como isso seria feito com a abordagem tradicional.
Método Tradicional
Criamos uma nova lista de alunos de Direito. Percorremos a lista de alunos existente com um foreach. Dentro do foreach, utilizamos uma condição if para verificar se o curso do aluno é Direito. Se for, adicionamos o aluno à nova lista. Imprimimos essa nova lista na tela.
public class Program
{
static void Main(string[] args)
{
var alunos = new List<Aluno>()
{
new Aluno(idade: 17, nome: "João", curso: "Direito"),
new Aluno(idade: 25, nome: "Maria", curso: "Direito"),
new Aluno(idade: 35, nome: "Fernando", curso: "Sistemas de Informação"),
new Aluno(idade: 18, nome: "Pedro", curso: "Direito"),
};
// Método tradicional
var alunosDireito = new List<Aluno>();
foreach (var aluno in alunos)
{
if(aluno.Curso == "Direito")
{
alunosDireito.Add(aluno);
}
}
foreach (var alunoDireito in alunosDireito)
{
Console.WriteLine($"O aluno {alunoDireito.Nome} está cursando {alunoDireito.Curso}");
}
}
}
Embora esse método funcione bem, ele pode ser otimizado com o uso do LINQ, reduzindo a quantidade de código e melhorando a performance.
Utilizando LINQ
Com LINQ, podemos simplificar o código. A sintaxe do LINQ permite realizar a filtragem diretamente na lista original. Abaixo mostramos como fazer isso:
var alunosDireitoLinq = from aluno in alunos where aluno.Curso == "Direito" select aluno;
Neste exemplo, utilizamos a sintaxe do LINQ para percorrer a lista de alunos e aplicar a condição diretamente na consulta. O código é muito mais conciso do que o método tradicional.
Outra maneira de usar o LINQ é aplicá-lo diretamente no objeto lista, como mostrado abaixo:
var alunosDireito = alunos.Where(aluno => aluno.Curso == "Direito").ToList();
Aqui, utilizamos o método Where
diretamente no objeto alunos
, o que torna o código ainda mais simples e direto. Sendo assim, nosso código fica dessa forma:
public class Program
{
static void Main(string[] args)
{
var alunos = new List<Aluno>()
{
new Aluno(idade: 17, nome: "João", curso: "Direito"),
new Aluno(idade: 25, nome: "Maria", curso: "Direito"),
new Aluno(idade: 35, nome: "Fernando", curso: "Sistemas de Informação"),
new Aluno(idade: 18, nome: "Pedro", curso: "Direito"),
};
// Usanod o Linq
var alunosDireito = alunos.Where(aluno => aluno.Curso == "Direito").ToList();
foreach (var alunoDireito in alunosDireito)
{
Console.WriteLine($"O aluno {alunoDireito.Nome} está cursando {alunoDireito.Curso}");
}
}
}
Introdução ao Entity Framework
Agora, vamos ver como integrar o LINQ com o Entity Framework (EF), que é uma ferramenta moderna de acesso a dados em C#. Ele permite manipular dados de forma mais eficiente, adicionando valores e realizando consultas diretamente no banco de dados. Vamos usar o Entity Framework no lugar do DataSet tradicional para fazer essa integração.
Configurando o Entity Framework
- Primeiro, precisamos instalar o Entity Framework. Usamos o NuGet Package Manager para instalar o pacote
Npgsql.EntityFrameworkCore.PostgreSQL
, que faz a integração com o PostgreSQL. - Em seguida, substituímos o antigo método de conexão por um contexto do Entity Framework, que facilita a comunicação com o banco.
public class DbConnection : DbContext
{
public DbSet<Aluno> { get; set; }
protected override void OnConfiguration(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseNpgsql("Server=localhot;Port=5432;Database=portal_do_aluno;User Id=postgres;Password=123456");
}
Obs.: A classe que herda de
DbContext
é responsável por gerenciar as operações no banco de dados, como mapear tabelas para classes do sistema. - Definimos as propriedades da classe
Aluno
para corresponderem às colunas do banco de dados. Se houver diferenças nos nomes, utilizamos o atributo[Table("NomeDaTabela")]
para alinhar isso.using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[Table("aluno")] // identificação do nome da tabela
public class Aluno
{
[Key] // Identificação da chave primária
public int Id { get; set; }
public int Idade { get; set; }
public string Nome { get; set; }
public string Curso { get; set; }
public Aluno() { }
public Aluno(int idade, string nome, string curso)
{
Idade = idade;
Nome = nome;
Curso = curso;
}
}
Obs.: Para identificar a chave primária da tabela, utilizamos o atributo
[Key]
no campo correspondente.
Agora que configuramos tudo, podemos começar a fazer consultas e inserções no banco de dados.
Consultando Dados com o Entity Framework e LINQ
Aqui está um exemplo de como buscar todos os alunos usando o Entity Framework com LINQ:
public class AlunoRepository
{
private readonly DbConnection _context = new DbConnection();
public List<Aluno> GetAlunos()
{
return _context.Alunos.ToList();
}
}
Isso retorna uma lista de alunos diretamente da tabela do banco de dados.
Adicionando Dados com o Entity Framework
Para adicionar um novo aluno no banco de dados, podemos fazer da seguinte forma:
public class AlunoRepository
{
private readonly DbConnection _context = new DbConnection();
public List<Aluno> GetAlunos()
{
return _context.Alunos.ToList();
}
// Inclusão do método para adicionar aluno
public void AdicionarAluno(Aluno aluno)
{
_context.Alunos.Add(aluno);
_context.SaveChanges();
}
}
A estrutura do código fica muito mais enxuta e fácil de entender, e podemos gerenciar os dados com muito menos código.
Testando a Aplicação
Rodamos a aplicação para verificar se as alterações funcionam. O sistema carregou corretamente os alunos do banco de dados. Também testamos a inserção de um novo aluno. Após adicionar o aluno, verificamos se ele foi salvo com sucesso ao rodar o projeto novamente. Tudo funcionou conforme o esperado, com as consultas e inserções sendo feitas via Entity Framework e LINQ.
Conclusão
Nesta aula, vimos uma introdução ao LINQ e como ele pode simplificar o código de consultas e filtragens em listas. Também introduzimos o Entity Framework, uma poderosa ferramenta para manipulação de dados que trabalha em conjunto com o LINQ para facilitar a integração com bancos de dados. Com o LINQ e o Entity Framework, podemos otimizar o acesso a dados de maneira muito mais eficiente e com menos código.
Se você quiser acompanhar o tutorial completo, acesse o vídeo e inscreva-se no canal do BraboDev.
“E a luz resplandece nas trevas, e as trevas não a compreenderam”
João 1:5