ef core 2 apply HasQueryFilter for all entity

entity-framework entity-framework-core

Question

Is there any way to apply "HasQueryFilter" globaly to all my entity ? I don't want to add in modelbuilder one by one ?

modelBuilder.Entity<Manufacturer>().HasQueryFilter(p => p.IsActive);
1
3
8/22/2017 8:21:49 AM

Popular Answer

In case you have base class or interface defining the IsActive property, you could use the approach from Filter all queries (trying to achieve soft delete).

Otherwise you could iterate entity types, and for each type having bool IsActive property build dynamically filter expression using Expression class methods:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    var isActiveProperty = entityType.FindProperty("IsActive");
    if (isActiveProperty != null && isActiveProperty.ClrType == typeof(bool))
    {
        var parameter = Expression.Parameter(entityType.ClrType, "p");
        var filter = Expression.Lambda(Expression.Property(parameter, isActiveProperty.PropertyInfo), parameter);
        entityType.QueryFilter = filter;
    }
}

Update (EF Core 3.0): Due to public metadata API breaking change (replacing many properties with Get / Set extension methods), the last line becomes

entityType.SetQueryFilter(filter);
6
11/15/2019 1:19:08 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow