当用户是管理员时,我想将数据库中的isDeleted
值包括到我的索引中。我使用了全局查询过滤器来过滤数据。
这是我的代码:
var param = Expression.Parameter(entity.ClrType);
var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool));
var isDeleted = Expression.Call(propertyMethodInfo, param, Expression.Constant("IsDeleted"));
BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeleted, Expression.Constant(false));
var lambdaExpression = Expression.Lambda(compareExpression, param);
builder.Entity(entity.ClrType).HasQueryFilter(lambdaExpression);
答案 0 :(得分:4)
解决方案是将其他条件添加到全局查询过滤器,并确保对其进行动态评估。基本上在Global Query Filters示例中说明了该技术:
提示
请注意DbContext实例级别字段的使用:_tenantId用于设置当前租户。模型级过滤器将使用正确上下文实例中的值。即正在执行查询的实例。
必不可少的部分是使用DbContext
的实例字段/属性/方法,否则过滤器将不是动态的。
然后,在您的DbContext
中添加一个字段:
bool includeDeleted = false;
并修改您的代码以生成p => this.includeDeleted || p.IsDeleted == false
:
// ...
var includeDeleted = Expression.Field(Expression.Constant(this), "includeDeleted");
var condition = Expression.OrElse(includeDeleted, compareExpression);
var lambdaExpression = Expression.Lambda(condition, param);
builder.Entity(entity.ClrType).HasQueryFilter(lambdaExpression);
如何填充该字段取决于您。可以通过构造函数参数/注入,公共属性等。