【问题标题】:Include the IsDeleted values when user is admin当用户是管理员时包括 IsDeleted 值
【发布时间】:2018-06-22 16:02:34
【问题描述】:

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

【问题讨论】:

  • 你问的是如何忽略特定用户的过滤器?
  • @IvanStoev 是的。如果用户是管理员,过滤器不应该工作
  • HI darwin,您对已删除帖子的回答是 $a=array(array(array(5,4,3),array(1,2,3)),array(array(20,30 ,40),数组(50,60,70))); foreach($a as $key=>$val){ foreach($val as $key1=>$val1){ echo "".$key." ".$key1." ".(array_sum($val1)). "
    "; } }

标签: c# lambda entity-framework-core


【解决方案1】:

解决方案是向全局查询过滤器添加额外的条件,并确保对其进行动态评估。该技术基本上在Global Query Filters 示例中进行了说明:

提示

注意使用 DbContext 实例级别字段:_tenantId 用于设置当前租户。模型级过滤器将使用来自正确上下文实例的值。 IE。正在执行查询的实例。

关键部分是使用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);

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

【讨论】:

  • 请注意,这在使用 EF Core 2.0.0 时不起作用,因为过滤器不包含在结果查询中。使用更高版本为我解决了这个问题。
猜你喜欢
  • 2021-09-22
  • 1970-01-01
  • 2012-06-10
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多