DEV Community

Guilherme Govaski
Guilherme Govaski

Posted on

5 dicas para montar consultas mais performáticas com o LINQ

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();
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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;
  }
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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(...);
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)