Entendendo o Método AsNoTracking do LINQ em .NET3 min read

Categoria: ASP.NET Banco de dados C#

Fala pessoal \o Hoje, vamos falar um pouco sobre, o LINQ (Language Integrated Query). Esta ferramenta desempenha um papel crucial na manipulação de dados de uma maneira mais expressiva e poderosa. No contexto do Entity Framework – o ORM mais querido para os apaixonados por .NET – há uma função chamada AsNoTracking que é frequentemente subestimada. Vamos entender como usar este método e porque ele pode ser muito importante para aumentar a performance de suas consultas com o EF (Entity Framework).

O que é o método AsNoTracking?

Quando você executa uma consulta LINQ usando o Entity Framework, por padrão, todas as entidades retornadas são anexadas ao DbContext. Isso significa que qualquer alteração feita nessas entidades será rastreada e, em seguida, salva no banco de dados quando o método SaveChanges for chamado. Isso é útil para cenários de CRUD, mas tem seu custo em termos de performance. Portanto, em operações de escrita o EF, executa todo esse rastreamento por baixo dos panos.

Aqui é onde entra o método AsNoTracking. Quando aplicado a uma consulta, ele instrui o Entity Framework a não rastrear as entidades retornadas pela consulta. Isso significa que qualquer alteração feita nas entidades não será refletida no banco de dados quando SaveChanges for chamado. Imagine que no cenário abaixo você queira recuperar todos os Customers. Se nesta operação, você garantidamente não vai fazer nenhuma operação de escrita posterior, você poderá usar o método AsNoTracking().

public List<Customer> GetCustomersForReport()
{
    using (var context = new AppDbContext())
    {
        return context.Customers.AsNoTracking().ToList();
    }
}

Neste exemplo, estamos obtendo uma lista de clientes para gerar um relatório. Como não precisamos fazer nenhuma alteração nesses clientes, podemos usar AsNoTracking para melhorar o desempenho da consulta.

Por que usar o AsNoTracking?

Então, por que alguém iria querer usar AsNoTracking? A resposta simples é desempenho. O rastreamento de entidades é um processo que consome recursos. Se você estiver executando uma operação de somente leitura e não tiver intenção de alterar os dados, o rastreamento será um desperdício desnecessário de recursos.

Além disso, o uso de AsNoTracking pode ajudar a evitar alguns problemas comuns que podem surgir ao lidar com o ciclo de vida do DbContext. Por exemplo, pode ajudar a evitar erros relacionados a entidades sendo rastreadas por mais de um contexto.

Abaixo, você pode ver que o desempenho é bem significativo, com uma consulta sendo feita em menor tempo.

Teste foi feito com as instruções chamadas em ordem diferente, também.

Observe que:

No cenário de teste acima, a tabela Users tinha: 240 registros e com isso temos:

  • 3ms – para consulta operando SEM o tracking do Entity Framework (usando o método AsNoTracking)
  • 11ms – para uma consulta operando com tracking do Entity Framework

Uma excelente forma de otimizar consultas com o EF, você não acha?

Conclusão

O método AsNoTracking é uma ferramenta útil que pode ajudar a melhorar o desempenho de suas consultas LINQ quando usado corretamente. Lembre-se, no entanto, que ele deve ser usado com cautela. Se você usá-lo em uma situação onde realmente precisa rastrear mudanças nas entidades, pode acabar com resultados inesperados.

Fontes:

DbExtensions.AsNoTracking Method: https://learn.microsoft.com/en-us/dotnet/api/system.data.entity.dbextensions.asnotracking?view=entity-framework-5.0.0
Entity Framework and AsNoTracking: https://www.c-sharpcorner.com/UploadFile/ff2f08/entity-framework-and-asnotracking/

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *