当用户为admin时包含IsDeleted值

时间:2018-06-22 06:52:43

标签: c# lambda entity-framework-core

当用户是管理员时,我想将数据库中的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);

1 个答案:

答案 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);

如何填充该字段取决于您。可以通过构造函数参数/注入,公共属性等。