Programação com C# LINQ e Entity Framework

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

  1. 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.
  2. 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.

  3. 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

Rolar para cima