Поиск  
Always will be ready notify the world about expectations as easy as possible: job change page
Jul 1

Global query filters in EF Core

Global query filters in EF Core
Автор:
Источник:
Просмотров:
3016

Say goodbye to the hassle of having to manually set a default filter for every query

EF Core provides a useful feature called Global Query Filters. It enables you to apply a filter to all queries sent to the database. Two examples of how this feature can be practically used are implementing soft delete and creating a multitenant database.

Building your own query filter

I will assume that you have already established the Database Context class for EF Core.

To add custom query filters, simply modify the OnModelCreating method in the DatabaseContext. Remember, setting query filters only affects specific tables within the database. To filter each table globally, we need to set a query filter on that particular entity.

For instance, the following piece of code creates a global query filter to ignore soft-deleted users:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // Add a query filter to ignore all soft-deleted users
    modelBuilder.Entity<User>().HasQueryFilter(u => !u.IsDeleted);
}

Using extension methods

One thing I enjoy doing is developing an extension method that contains the soft delete logic and then implementing it as a query filter.

public static class ModelBuildExtensions
{
    public static void AddIsDeletedQueryFilter<T>(this ModelBuilder modelBuilder) where T : class, IBaseEntity
    {
        modelBuilder.Entity<T>().HasQueryFilter(u => !u.IsDeleted);
    }
}

With the use of this extension method, it is now possible to add soft delete global query filters in the following way:

// Add soft-delete global query filter for all of these entities
modelBuilder.AddIsDeletedQueryFilter<User>();
modelBuilder.AddIsDeletedQueryFilter<Image>();
modelBuilder.AddIsDeletedQueryFilter<Comment>();
modelBuilder.AddIsDeletedQueryFilter<Article>();

Ignoring global query filters

Having global query filters is great, but what if you need to view soft-deleted users specifically?

Fortunately, we can bypass global query filters by using the IgnoreQueryFilters() method through chaining.

var softDeletedUsers = _databaseContext.Users
  .IgnoreQueryFilters() // this line does the magic
  .Where(user => user.IsDeleted)
  .ToList();

Using multiple query filters

Unfortunately, EF Core does not allow you to define multiple query filters on the same entity.

// This won't work, as an entity can only have one query filter in EF Core
modelBuilder.Entity<User>()
  .HasQueryFilter(u => !u.Age < 18)
  .HasQueryFilter(u => !u.IsDeleted);

At the time of writing this, this is currently an open issue on the EF Core Github page: https://github.com/dotnet/efcore/issues/10275.

But, if your query filter is straightforward, you can combine them into one query filter.

// This will work, as it's only one query filter
modelBuilder.Entity<User>()
  .HasQueryFilter(u => !u.Age < 18 || !u.IsDeleted);
Похожее
Mar 20
...
Dec 18, 2023
Author: Jay Krishna Reddy
In C# applications, null reference exceptions are frequently the cause of problems and runtime failures. Appropriate null checks are necessary to protect your code from these kinds of problems. This article will examine many approaches to doing null checks in...
Jun 20
Author: Sukhpinder Singh
Dapper and EF Core are popular .NET libraries for data access and management. Both have strengths and weaknesses, and the choice will depend on the project's specific requirements. In this article, we'll compare Dapper and EF Core in terms of...
May 23
Author: Bhushan Kadam
If you’re a .NET developer, chances are you’ve had to deal with scheduling tasks at some point. Cron jobs are a common way to do this, but they can be tedious to set up and maintain. Enter Hangfire, a powerful...
Написать сообщение
Тип
Почта
Имя
*Сообщение
RSS
Если вам понравился этот сайт и вы хотите меня поддержать, вы можете
Компиляция и запуск C# и Blazor внутри браузера
Доводим разработчика до выгорания: три простых шага
Вопросы с собеседований, которые означают не то, что вы думаете
9 главных трендов в разработке фронтенда в 2024 году
Проблема непонимания существующего кода, или Как руководству делать не надо
Что такое микросервисная архитектура и когда ее применять
Замыкания в JavaScript для начинающих
Performance review, ачивки и погоня за повышением грейда — что может причинить боль сотруднику IT-компании?
Остановись, мгновенье. Медленное программирование — тренд для уставших разработчиков
Soft skills: 18 самых важных навыков, которыми должен владеть каждый работник
LinkedIn: Sergey Drozdov
Boosty
Donate to support the project
GitHub account
GitHub profile