C# 表达式树中不同类型的比较

C# 表达式树中不同类型的比较,c#,rest,filter,expression-trees,C#,Rest,Filter,Expression Trees,在我的API中,我提供了过滤结果的选项-类似于SQL语句WHERE。如果我使用字符串字段并将其与字符串值进行比较,则此操作有效: 现在我只返回名为“test”的项目 但是,如果我想将其应用于bool字段(在本例中称为“isActive”),则仅返回活动项: 然后我得到以下异常: System.InvalidOperationException:'未为类型'System.Nullable`1[System.Boolean]'和'System.String'定义二进制运算符Equal' 我使用以

在我的API中,我提供了过滤结果的选项-类似于SQL语句WHERE。如果我使用字符串字段并将其与字符串值进行比较,则此操作有效:

现在我只返回名为“test”的项目

但是,如果我想将其应用于bool字段(在本例中称为“isActive”),则仅返回活动项:

然后我得到以下异常: System.InvalidOperationException:'未为类型'System.Nullable`1[System.Boolean]'和'System.String'定义二进制运算符Equal'

我使用以下代码创建表达式:

    static Expression<Func<T, bool>> GetExpressionForFilter<T>(string propertyName, string propertyValue)
    {
        var nameForWhereClause = propertyName.ToLowerInvariant();
        var valueForWhereClause = propertyValue.Trim().ToLowerInvariant();

        var parameterExp = Expression.Parameter(typeof(T), "type");
        var propertyExp = Expression.Property(parameterExp, nameForWhereClause);

        ConstantExpression someValue = Expression.Constant(valueForWhereClause, typeof(string));


        return Expression.Lambda<Func<T, bool>>(Expression.Equal(propertyExp, someValue), parameterExp);
    }
静态表达式GetExpressionForFilter(string propertyName,string propertyValue)
{
var nameForWhereClause=propertyName.ToLowerInvariant();
var valueForWhereClause=propertyValue.Trim().ToLowerInvariant();
var parameterExp=表达式参数(typeof(T),“type”);
var propertyExp=Expression.Property(parameterExp,nameforwhere子句);
ConstantExpression someValue=表达式.常量(valueForWhereClause,typeof(string));
返回表达式.Lambda(表达式.Equal(propertyExp,someValue),参数Exp);
}
并将表达式应用于我的收藏:

        var condition = GetExpressionForFilter<TEntity>(entitiesResourceParameters.FilterFieldName, entitiesResourceParameters.FilterFieldValue);
        condition.Compile();

        var collectionAfterFilter = collectionBeforeFilter.Where(condition).AsQueryable();
var condition=GetExpressionForFilter(entitiesResourceParameters.FilterFieldName,entitiesResourceParameters.FilterFieldValue);
Compile()条件;
var collectionAfterFilter=collectionBeforeFilter.Where(条件).AsQueryable();
在将属性类型与“true”或“false”字符串进行比较之前,我尝试将属性类型转换为字符串,但这没有什么区别


我希望能够输入任何类型的字段(包括布尔值),并将其与该字段的值(作为字符串)进行比较(例如,“true”或“false”)。这可能吗?

您可以将字符串值转换为要与之进行比较的类型

    var propertyType = property.PropertyType;
    var value = Convert.ChangeType(valueForWhereClause, propertyType);

    ConstantExpression someValue = Expression.Constant(value, propertyType);

请注意,如果提供了无效值(例如,
&filterfieldvalue=foo
),Convert.ChangeType可能会引发异常。

如果要比较的类型是
T
,则无法获取属性的类型,将其转换,然后正确比较,而不是将所有内容解释为字符串?