C# 表达式类,将布尔值更改为字符串比较

C# 表达式类,将布尔值更改为字符串比较,c#,lambda,C#,Lambda,我们的数据库到处都有IsActive布尔值作为软删除。我们有一个实体框架,用该标志阻止所有请求。我们最近更改了数据库,改为使用状态码字符串,而不是IsActive标志 如何将下面的表达式改为检查StatusCode==ACTIVE foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { var isActiveProperty = entityType.FindProperty("IsActive"

我们的数据库到处都有IsActive布尔值作为软删除。我们有一个实体框架,用该标志阻止所有请求。我们最近更改了数据库,改为使用状态码字符串,而不是IsActive标志

如何将下面的表达式改为检查StatusCode==ACTIVE

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
  var isActiveProperty = entityType.FindProperty("IsActive");
  if (isActiveProperty != null && isActiveProperty.ClrType == typeof(bool))
  {
    var parameter = Expression.Parameter(entityType.ClrType, "p");
    var filter = Expression.Lambda(Expression.Property(parameter, isActiveProperty.PropertyInfo), parameter);
    entityType.QueryFilter = filter;
  }
}
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    var isActiveProperty = entityType.FindProperty("StatusCode");
    if (isActiveProperty != null && isActiveProperty.ClrType == typeof(string))
    {
       var parameter = Expression.Parameter(entityType.ClrType, "p");
       var filter = Expression.Lambda(Expression.Property(parameter, isActiveProperty.PropertyInfo), parameter);
       entityType.QueryFilter = filter;//entityType.SetQueryFilter(filter);//Update for ef 3.0
    }
}
我尝试将类型更改为以下类型,但不起作用。Lambda是这样写的,这把我从Lambda/parameter长格式中甩了出来。我需要在某个地方比较isActivityProperty==ACTIVE

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
  var isActiveProperty = entityType.FindProperty("IsActive");
  if (isActiveProperty != null && isActiveProperty.ClrType == typeof(bool))
  {
    var parameter = Expression.Parameter(entityType.ClrType, "p");
    var filter = Expression.Lambda(Expression.Property(parameter, isActiveProperty.PropertyInfo), parameter);
    entityType.QueryFilter = filter;
  }
}
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    var isActiveProperty = entityType.FindProperty("StatusCode");
    if (isActiveProperty != null && isActiveProperty.ClrType == typeof(string))
    {
       var parameter = Expression.Parameter(entityType.ClrType, "p");
       var filter = Expression.Lambda(Expression.Property(parameter, isActiveProperty.PropertyInfo), parameter);
       entityType.QueryFilter = filter;//entityType.SetQueryFilter(filter);//Update for ef 3.0
    }
}
我想你在追求:

Expression.LambdaExpression.EqualExpression.Propertyparameter,状态码, Expression.ConstantACTIVE、typeOfsString、参数; 注意:如果FindProperty返回成员,您也可以在Expression.Property中使用它来避免第二次反射查找:

Expression.LambdaExpression.EqualExpression.Propertyparameter,IsActivityProperty, Expression.ConstantACTIVE、typeOfsString、参数; 我想你在追求:

Expression.LambdaExpression.EqualExpression.Propertyparameter,状态码, Expression.ConstantACTIVE、typeOfsString、参数; 注意:如果FindProperty返回成员,您也可以在Expression.Property中使用它来避免第二次反射查找:

Expression.LambdaExpression.EqualExpression.Propertyparameter,IsActivityProperty, Expression.ConstantACTIVE、typeOfsString、参数;
您为每种类型生成了如下代码:

.QueryFilter=p=>p.IsActive; 现在你想要

.QueryFilter=p=>p.StatusCode==ACTIVE; 我发现用C编写所需的表达式很有用,然后使用调试器查看C编译器如何将其转换为表达式图。或者浏览Expression类上的静态方法,猜我可能需要什么

在您的情况下,您需要lambda主体包含额外的相等测试和常量值

Expression.EqualExpression.Property…,Expression.ConstantACTIVE 但是,还有其他方法可以使用C编译器创建所需的表达式。比如,

公共接口HasStatus{ 状态代码{get;set;} } 公共静态void SetQueryFilterModelBuilder生成器,其中T:HasStatus=> builder.Entity.HasQueryFilterp=>p.StatusCode==ACTIVE; GetMethodSetQueryFilter的类型 .MakeGenericMethodentityType.ClrType .Invokenull,新对象[]{builder};
您为每种类型生成了如下代码:

.QueryFilter=p=>p.IsActive; 现在你想要

.QueryFilter=p=>p.StatusCode==ACTIVE; 我发现用C编写所需的表达式很有用,然后使用调试器查看C编译器如何将其转换为表达式图。或者浏览Expression类上的静态方法,猜我可能需要什么

在您的情况下,您需要lambda主体包含额外的相等测试和常量值

Expression.EqualExpression.Property…,Expression.ConstantACTIVE 但是,还有其他方法可以使用C编译器创建所需的表达式。比如,

公共接口HasStatus{ 状态代码{get;set;} } 公共静态void SetQueryFilterModelBuilder生成器,其中T:HasStatus=> builder.Entity.HasQueryFilterp=>p.StatusCode==ACTIVE; GetMethodSetQueryFilter的类型 .MakeGenericMethodentityType.ClrType .Invokenull,新对象[]{builder};
expression.lambdaexpression.equalexpression.property、expression.constant、parameter?如果这还不够的话,我可以写那么长。如果可以的话,我想我很接近var filter=Expression.LambdaExpression.EqualExpression.PropertyStatusCode,Expression.ConstantACTIVE,parameter;但这不是正确的syntaxexpression.lambdaexpression.equalexpression.property、expression.constant和参数?如果这还不够的话,我可以写那么长。如果可以的话,我想我很接近var filter=Expression.LambdaExpression.EqualExpression.PropertyStatusCode,Expression.ConstantACTIVE,parameter;但这不是正确的答案,100%同意。实现接口是实现这一点的更简洁的方法。不幸的是,我们正在使用实体框架反向POCO生成来生成实体,我不知道如何添加接口,而不在重新生成时将其覆盖。@如果您使用第二个代码文件,它们将作为部分类生成,这意味着在同一命名空间中的第二个文件中,您可以做:分部类Foo:isome接口{}-您还可以添加属性、方法等;所有部分框架都是组合的,但注意:顺序没有定义,这有时对静态字段初始值设定者非常重要,因为他们100%同意。实现接口是实现这一点的更简洁的方法。不幸的是,我们正在使用实体框架反向POCO生成来生成实体,我不知道如何添加接口而不在重新生成时被覆盖。如果您使用第二个代码文件,它们是通用的
ted作为分部类,这意味着在同一名称空间中的第二个文件中,您可以执行以下操作:分部类Foo:isome接口{}-您还可以添加属性、方法等;所有部分框架都是组合的,但注意:顺序没有定义,这有时对静态字段初始值设定者很重要。您的第一个语句完全按照我的需要工作,谢谢!第二个给了我一个isActiveProperty错误,无法将IMutableProperty转换为MethodInfo您的第一个语句完全按照我的需要工作,谢谢!第二个错误是isActiveProperty,无法将IMutableProperty转换为MethodInfo