比较表达式树中的不同类型
Comparing different types in Expression Trees
在我的 API 中,我提供了过滤结果的选项 - 类似于 SQL 语句 WHERE。如果我使用字符串字段并将其与字符串值进行比较,这将起作用:
https://apiurl/items?filterfieldname=name&filterfieldvalue=test
现在我只取回名称为 "test"
的项目
但是,如果我想将其应用于布尔字段(在本例中称为 "isActive"),仅 return 活动项目:
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);
}
并将表达式应用到我的 collection:
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
),Convert.ChangeType 会引发异常。
在我的 API 中,我提供了过滤结果的选项 - 类似于 SQL 语句 WHERE。如果我使用字符串字段并将其与字符串值进行比较,这将起作用:
https://apiurl/items?filterfieldname=name&filterfieldvalue=test
现在我只取回名称为 "test"
的项目但是,如果我想将其应用于布尔字段(在本例中称为 "isActive"),仅 return 活动项目:
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);
}
并将表达式应用到我的 collection:
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
),Convert.ChangeType 会引发异常。