Perform Identity Resolution

9 minuto(s) de leitura - June 10, 2020

01

Olá tudo bem?!

O novo recurso que irei apresentar está em preview ainda, e será lançada de oficialmente em Novembro deste ano, como parte do Entity Framework Core 5.

É muito bom lembrar também que o EF Core 5 é uma das versões mais esperadas e está recheada de várias novidades, hoje irei apresentar um recurso muito interessante e extremamente importante.

AsNoTracking

AsNoTracking é um dos recursos mais utilizados por usuários do Entity Framework Core para efetuar consultas em um banco de dados, costumamos dizer que é uma consulta somente leitura, por que os dados retornados pelo banco de dados não serão rastreados e pode existir situações que essa abordagem se torna muito mais rápida, por não ter a necessidade de gerenciar o estado dos objetos.

Veja um exemplo de uma consulta utilizando AsNoTracking:
using var db = new ExemploContext();

var itens = db
    .Itens
    .AsNoTracking()
    .Include(p => p.Pedido)
    .Where(p => p.PedidoId == "EXEF001")
    .ToList()
Basicamente esse é o comportamento que todos conhecem, mas existe algo que você precisa saber, na consulta acima para cada Item será criada uma nova instância de Pedido.

Vamos pegar o seguinte cenário onde eu tenho:
1    (um)  - Pedido (Código do pedido = EXEF001)
1000 (mil) - Itens (Esses itens são do pedido -> EXEF001)

Se sua consulta retornou 1.000 (mil itens) e todos fazem parte de um único Pedido, teremos 2.000 (duas mil) instâncias de objetos agora, isso pode ser um problema de uso de memória, e pode causar lentidão em sua aplicação, o team do Entity Framework Core vem fazendo um ótimo trabalho e fazendo com que o ORM a cada versão seja mais produtivo e performático, mas aqui neste ponto específico temos um pequeno problema, que é o alocamento de objetos em memória, o qual poderia ser resolvido de maneira mais inteligente.

Perform Identity Resolution

Certo, temos um problema e qual é a solução?
Existe uma nova feature, que é um método de extensão (PerformIdentityResolution), extremamente inteligente e capaz de resolver esse problema de alocação de objetos em memória, assim em vez de ter 1.000(mil) instâncias de Pedido, passa agora ter uma única instância e a lista de Itens agora passa a usar esta única referência, além de deixar aplicação mais performática, veja como ficou simples de resolver isso na nova versão do EF Core 5:
using var db = new ExemploContext();

var itens = db
    .Itens
    .AsNoTracking()
    .PerformIdentityResolution() // Aqui está a solução
    .Include(p => p.Pedido)
    .Where(p => p.PedidoId == "EXEF001")
    .ToList()

Observe que agora usamos o seguinte metódo (PerformIdentityResolution) ele é o responsável por resolver esse pequeno problema de alocação de objetos em memória.

FYI: Esse novo recurso aplica-se apenas para consultas quando usado o AsNoTracking.

Twitter

Fico por aqui! 😄
Me siga no twitter: @ralmsdeveloper


Deixe um comentário