EF Core Advanced
Query performance, Raw SQL, Dapper, concorrencia otimista e Global Query Filters
Principio: EF Core gera SQL β voce e responsavel por garantir que o SQL gerado seja eficiente. Use
ToQueryString() para inspecionar, e sempre meΓ§a antes de otimizar. Query Pipeline do EF Core
Toda query LINQ passa por um pipeline de traducao antes de chegar ao banco. Entender esse pipeline ajuda a diagnosticar problemas de performance.
| Etapa | O que acontece | Onde otimizar |
|---|---|---|
| LINQ Expression | Codigo C# com Where, Include, Select | Projections, filtros, paginacao |
| Expression Tree | Representacao em arvore da query | Evite IEnumerable no meio β force IQueryable |
| SQL Generator | Traduz para SQL do provider | Verifique com ToQueryString() |
| Database | Executa SQL, retorna rows | Indices, execution plan, estatisticas |
| Materialization | Mapeia rows para objetos C# | AsNoTracking, projections com Select |
Client evaluation: Se o EF nao conseguir traduzir uma expressao para SQL, ele avalia no cliente (puxa TODOS os dados e filtra em memoria). No EF Core 3+, isso gera excecao por padrao. Verifique logs para warnings de
Microsoft.EntityFrameworkCore.Query. O que e o problema N+1 queries?
Acontece quando voce carrega uma colecao (1 query) e depois acessa uma navigation property de cada item (N queries). Exemplo: carregar 100 Orders e acessar
order.Customer.Name de cada um gera 1 + 100 queries. Solucao: Include() para Eager loading, ou Select() para projecao. Em APIs, sempre use Include ou projete com Select.