EF Core SetQueryFilter 反转 IsActive 到 OnModelCreating 中的 IsDeleted

EF Core SetQueryFilter Reverse IsActive to IsDeleted in OnModelCreating

我在所有表中都使用了 IsActive 列。当它没有任何错误时 return 我在 OnModelCreating 中应用了过滤器。

但我将其更改为 IsDeleted 列,因此当 IsDeleted 为真时,数据库中不会 return 任何内容。

这是我的过滤器代码片段。但问题是当 IsDeleted 为真时,我从数据库中获取数据。但我想当 IsDeleted 为 false 时,我将从数据库中获取数据。

var isDeletedProperty = entityType.FindProperty("IsDeleted");
if (isDeletedProperty != null && isDeletedProperty.ClrType == typeof(bool))
{
    var parameter = Expression.Parameter(entityType.ClrType, "p");
    var filter = Expression.Lambda(Expression.Property(parameter, isDeletedProperty.PropertyInfo), parameter);
    entityType.SetQueryFilter(filter);
}
var isDeletedProperty = entityType.FindProperty("IsDeleted");
if (isDeletedProperty != null && isDeletedProperty.ClrType == typeof(bool))
{
    var parameter = Expression.Parameter(entityType.ClrType, "p");
    var filter = Expression.Lambda(
        Expression.Equal(
            Expression.Property(parameter, isDeletedProperty.PropertyInfo),
            Expression.Constant(false, typeof(bool))
        )
        , parameter);
    entityType.SetQueryFilter(filter);
}

目前你的过滤器是这样的

p => p.IsDeleted

即returns 已删除实体。而你真正需要的是

p => !p.IsDeleted

C# ! 运算符的 Expression 等价物是 Expression.Not,因此只需用它包围当前条件:

var body = Expression.Not(Expression.Property(parameter, isDeletedProperty.PropertyInfo));