5 dicas para montar consultas mais performáticas com o LINQ
Guilherme Govaski
Posted on March 7, 2024
Quando se trata de consultas ao banco de dados, é sempre necessário atentar a performance, pois consultas lentas podem acarretar uma pior experiência para o usuário, principalmente em cenários mais sensíveis onde a performance se torna crítica. Aqui estão algumas dicas para melhor uso do LINQ para fazer consultas em bancos de dados.
1. Uso do AsNoTracking
Você pode usar o método AsNoTracking do LINQ para que a entidade que você está consultando não seja rastreada e nem mantida em cache no DbContext ou ObjectContext, eliminando carga extra do Entity Framework para gerenciar o estado daquela entidade em memória. Exemplo:
var user = await dbContext.Users
.FirstOrDefault(user => user.Id == Id)
.AsNoTracking();
2. Filtrar somente o que será usado
Você deve filtrar somente os dados que você realmente irá usar, diminuindo a complexidade da consulta e evitando transferência de dados desnecessários entre o banco de dados e sua aplicação. Com o LINQ, você pode usar o método Select e instanciar um objeto anônimo para filtrar somente os dados desejados. Exemplo:
var users = await dbContext.Users
.Where(user => user. Age >= 18)
.Select(u => new { u.Name, u.Email, u.Age })
.ToListAsync();
3. Paginação dos dados
Quando uma consulta ao banco retorna MUITOS dados, é interessante limitar a quantidade de registros, por questões de performance. Você pode utilizar a abordagem da paginação, trazendo uma quantidade de dados específica durante uma consulta. Exemplo:
public async Task<List<LoginsAuditViewModel>> GetAllLoginsAuditAsync(int page, int pageSize)
{
var currentPage = (page - 1) * pageSize;
var loginsAudit = await dbContext.LoginsAudit
.Skip(currentPage)
.Take(pageSize);
return loginsAudit;
}
4. TryGetNonEnumeratedCount para obter o número total de elementos
O método TryGetNonEnumeratedCount do LINQ tenta buscar o número total de elementos de uma coleção sem necessariamente iterar individualmente sobre cada elemento para determinar isso, o que pode ser útil em cenários que você deseja saber o número total de elementos e ao mesmo sabe que possui muitos elementos. Exemplo:
dbContext.Users.TryGetNonEnumeratedCount(out var count);
5. Use o IQueryable para consultas complexas
Quando você tem uma consulta que faz muitos filtros e possui condicionais para filtrar os dados, você pode transformar a sua consulta em um IQueryable, que será executado diretamente no banco de dados com todos os filtros em uma só consulta. Isso pode ser útil para evitar transferência de dados desnecessários do banco de dados e para evitar o uso mais intenso de processamento para aplicar os filtros em memória. Exemplo:
if (condition1)
{
queryable = queryable.Where(...);
}
if (condition2)
{
queryable = queryable.Where(...);
}
if (condition3)
{
queryable = queryable.Where(...);
}
Posted on March 7, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.