【问题标题】:Comparing different types in Expression Trees比较表达式树中的不同类型
【发布时间】:2020-02-07 16:17:06
【问题描述】:

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

https://apiurl/items?filterfieldname=name&filterfieldvalue=test

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

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

https://apiurl/items?filterfieldname=isActive&filterfieldvalue=true

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

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

    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);
    }

并将表达式应用到我的收藏中:

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

        var collectionAfterFilter = collectionBeforeFilter.Where(condition).AsQueryable();

我尝试将属性类型转换为字符串,然后再将其与“true”或“false”字符串进行比较,但这没有任何区别。

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

【问题讨论】:

  • 如果T 是您要比较的类型,那么您不能获取属性的类型,转换它,然后正确比较,而不是将所有内容都解释为字符串吗?

标签: c# rest filter expression-trees


【解决方案1】:

您可以将字符串值转换为您尝试与之比较的类型。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2012-10-10
    相关资源
    最近更新 更多