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:
ASP .NET Core - Acessando dados com EF Core
Usando o EF Core com Windows Forms - CRUD
EF Core - Usando a abordagem DataBase First
EF Core - Fundamentos : Componentes
EF Core - Dicas de desempenho