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));
我在所有表中都使用了 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));