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.

RowsMapLINQExpressionExpression TreeSQL GeneratorSQL QueryDatabaseMaterializationC# Objects
EtapaO que aconteceOnde otimizar
LINQ ExpressionCodigo C# com Where, Include, SelectProjections, filtros, paginacao
Expression TreeRepresentacao em arvore da queryEvite IEnumerable no meio β€” force IQueryable
SQL GeneratorTraduz para SQL do providerVerifique com ToQueryString()
DatabaseExecuta SQL, retorna rowsIndices, execution plan, estatisticas
MaterializationMapeia 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.