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



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

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

现在我只取回名称为"测试"的项目

但是,如果我想将其应用于布尔字段(在本例中称为"isActive"(,则仅返回活动项目:

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

然后我得到以下异常: 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);
}

并将表达式应用于我的集合:

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

我尝试在将其与"true"或"false"字符串进行比较之前将属性类型转换为字符串,但这没有区别。

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

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

var propertyType = property.PropertyType;
var value = Convert.ChangeType(valueForWhereClause, propertyType);
ConstantExpression someValue = Expression.Constant(value, propertyType);

请注意,如果提供了无效值(例如&filterfieldvalue=foo(。

最新更新