Pular para conteúdo

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

  1. AsNoTracking Ativado: Elimina o snapshot de memória de entidades no contexto, acelerando a desserialização dos dados.
  2. AsSplitQuery Estratégico: Divide a consulta de pedidos e itens em duas chamadas SQL enxutas sem repetição redundante de cabeçalhos.
  3. Cancelamento Cooperativo: A passagem de CancellationToken garante que queries sejam canceladas no banco se o cliente fechar a conexão.

🎯 3. Próximos Passos & Sequência Didática