Aula 18 - Entity Framework Core 8 com Consultas Avançadas ⚡
Objetivo Pedagógico
Objetivo: Otimização de persistência com EF Core 8: consultas AsNoTracking, divisão de consultas com AsSplitQuery, interceptores de banco e mapeamento de colunas JSON nativas.
📑 1. Fundamentos Teóricos & Análise Técnica
O Entity Framework Core 8 (EF Core 8) é o motor de ORM oficial da Microsoft para o ecossistema .NET. Com avanços contínuos de desempenho, o EF Core 8 atinge taxas de transferência próximas a micro-ORMs como Dapper, oferecendo recursos corporativos sofisticados.
Técnicas de engenharia para extrair máxima performance do EF Core: 1. Consultas sem Rastreamento (AsNoTracking): Para operações de leitura em APIs REST, desativar o rastreador de mudanças (Change Tracker) reduz drasticamente a alocação de memória e o tempo de computação na CPU. 2. Divisão de Consultas (AsSplitQuery): Em consultas com múltiplos relacionamentos Include(), o comportamento padrão gera uma única query SQL com múltiplos LEFT JOIN, causando explosão cartesiana (Cartesian Explosion). O AsSplitQuery divide a busca em queries SQL individuais coordenadas, transferindo muito menos dados pela rede. 3. Colunas JSON Nativas: Mapeamento transparente de objetos complexos e listas para colunas JSON nativas do banco de dados relacional.
📐 Arquitetura Conceitual & Diagrama de Fluxo
graph TD
subgraph CartesianExplosion ["Problema Legado (Single Query)"]
SQLSingle["1 Única Query SQL com 4 LEFT JOINs"] --> NetBlow["Explosão Cartesiana: 100.000 linhas duplicadas trafegadas!"]
end
subgraph SplitQuery ["Solução EF Core 8 (AsSplitQuery)"]
Split1["Query 1: Pedidos"]
Split2["Query 2: Itens do Pedido"]
Split1 & Split2 --> Reconcile["EF Core reconcilia em memória: Payload 90% menor!"]
end
style CartesianExplosion fill:#ffebee,stroke:#c62828
style SplitQuery fill:#e8f5e9,stroke:#2e7d32 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Desativação de Change Tracker: Uso rotineiro de .AsNoTracking() em todas as consultas que não serão alteradas. - Prevenção de Explosão Cartesiana: Adoção de .AsSplitQuery() em grafos de dados com coleções 1:N aninhadas. - Mapeamento de Colunas JSON: Uso de .ToJson() na configuração do Fluent API para armazenar DTOs aninhados sem tabelas extras. - Interceptores de Auditoria: Injeção automática de CreatedAt, UpdatedAt e UserId via SaveChangesInterceptor.
🛠️ 2. Implementação Prática em C#, EF Core 8 e SQL Server / PostgreSQL
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// OrderRepository.cs (Consultas Otimizadas com EF Core 8)
using Microsoft.EntityFrameworkCore;
namespace Empresa.Core.Infrastructure.Persistence;
public class OrderRepository
{
private final AppDbContext _context;
public OrderRepository(AppDbContext context)
{
_context = context;
}
public async Task<List<Order>> GetRecentOrdersWithItemsAsync(Guid customerId, CancellationToken ct)
{
return await _context.Orders
.AsNoTracking() // 1. Desativa Change Tracker para leitura rápida
.AsSplitQuery() // 2. Previne explosão cartesiana no banco
.Include(o => o.Items)
.Where(o => o.CustomerId == customerId)
.OrderByDescending(o => o.CreatedAt)
.Take(20)
.ToListAsync(ct); // 3. Propaga CancellationToken
}
}
💡 Análise Passo a Passo do Código
- AsNoTracking Ativado: Elimina o snapshot de memória de entidades no contexto, acelerando a desserialização dos dados.
- AsSplitQuery Estratégico: Divide a consulta de pedidos e itens em duas chamadas SQL enxutas sem repetição redundante de cabeçalhos.
- Cancelamento Cooperativo: A passagem de
CancellationTokengarante que queries sejam canceladas no banco se o cliente fechar a conexão.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto