Eliminar QueryFilter en EF para una consulta en concreto

  • net-core
  • ef-core
  • tips
  • net
  • entity-framework
  • ignorequeryfilter
  • queryfilter

Hoy os traigo un tip sencillo, pero que nos puede servir de ayuda en ciertas situaciones.

Hace un tiempo escribí un post sobre cómo implementar el borrado lógico en Entity Framework dónde utilizaba un query filter para evitar que los registros borrados, de manera lógica, en una tabla no apareciesen en las consultas recibidas sobre ésta.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    ...
    var entityBuilder = modelBuilder.Entity<DbEntity>();
    entityBuilder.HasQueryFilter(x => !x.IsDeleted);
    ...
}

Pero, ¿qué pasa si hay alguna operación en la que sí necesito recuperar esos datos marcados como borrados? No hay problema, para conseguirlo basta con indicarle al DbSet de Entity Framework que ignore los query filters existentes.

Por ejemplo, si queremos contar todos los registros asociados a un usuario, independientemente de si están borrados o no, lo podríamos hacer de la siguiente manera.

return await DbEntity
    .IgnoreQueryFilters()
    .Where(x => x.UserId == userId)
    .CountAsync(cancellationToken);