EF Core 5.0 -  Filtered Included e Backing Fields


 Neste artigo vou apresentar dois novos recursos do EF Core 5.0:  Filtered Included e Backing Fields


Embora já estejamos na versão 6.0 do EF Core hoje vou apresentar dois recursos que foram lançados com o EF Core 5.0.

 

1 - Filtered Included

O método Include agora oferece suporte à filtragem das entidades incluídas. Ao aplicar o Include para carregar dados relacionados, você pode aplicar certas operações enumeráveis na navegação da coleção incluída, o que permite a filtragem e classificação dos resultados.

As operações com suporte são Where, OrderBy, OrderByDescending, ThenBy, ThenByDescending, Skip e Take, que devem ser aplicadas na navegação da coleção no lambda passado para o método Include, conforme mostrado no exemplo a seguir:

var blogs = context.Blogs
                  .Include(e => e.Posts.Where(p => p.Title.Contains("EF Core")))
                  .ToList();

A consulta acima retornará blogs junto com cada postagem associada, mas apenas quando o título da postagem contiver o texto: "EF Core".

Você também pode usar os métodos Skip e Take para reduzir o número de entidades incluídas.

var blogs = context.Blogs
                   .Include(e => e.Posts.OrderByDescending(post => post.Title).Take(5)))
                   .ToList();

Essa consulta retornará blogs com no máximo cinco postagens incluídas em cada blog.

2- Backing  Fields

Os backing fields ou campos de apoio permitem ao EF ler ou gravar em um campo em vez de em uma propriedade. Isso pode ser útil quando o encapsulamento na classe está sendo usado para restringir o uso ou aprimorar a semântica em torno do acesso aos dados pelo código do aplicativo, mas o valor deve ser lido ou escrito no banco de dados sem usar essas restrições(melhorias).

Por convenção, os campos a seguir serão descobertos como campos de apoio para uma determinada propriedade (listados em ordem de precedência):


_<nome da propriedade em camel-case>
_<nome da propriedade>
m_<nome da propriedade em camel-case>
m_<nome da propriedade>
 

No exemplo a seguir, a propriedade Url é configurada para ter _url como seu campo de apoio.

class MyContext : DbContext
{
     public DbSet<Blog> Blogs { get; set; }
}
 
public class Blog
{
     private string _url;
      public int BlogId { get; set; }
 
     public string Url
      {
           get { return _url; }
           set { _url = value; }
       }
}

Os campos de apoio são descobertos apenas para propriedades incluídas no modelo.

Você também pode configurar campos de apoio usando uma Data Annotations (disponível no EFCore 5.0) ou a Fluent API, por exemplo, se o nome do campo não corresponder às convenções acima:

a- Data Annotations

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
}
public class Blog
{
    private string _validatedUrl;
    public int BlogId { get; set; }
    [BackingField(nameof(_validatedUrl))]
    public string Url
    {
        get { return _validatedUrl; }
    }
    public void SetUrl(string url)
    {
        _validatedUrl = url;
    }
}

b- Fluent API

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Url)
            .HasField("_validatedUrl");
    }
}
public class Blog
{
    private string _validatedUrl;
    public int BlogId { get; set; }
    public string Url
    {
        get { return _validatedUrl; }
    }
    public void SetUrl(string url)
    {
        using (var client = new HttpClient())
        {
            var response = client.GetAsync(url).Result;
            response.EnsureSuccessStatusCode();
        }
        _validatedUrl = url;
    }
}

Por padrão, EF sempre lerá e gravará no campo de apoio. Ele presumirá que um foi configurado corretamente e nunca usará a propriedade. No entanto, o EF também oferece suporte a outros padrões de acesso.

"E muitos dos que dormem no pó da terra ressuscitarão, uns para vida eterna, e outros para vergonha e desprezo eterno."
Daniel 12:2

Referências:


José Carlos Macoratti