DevExpress使用BetweenOperator实现string属性转int范围过滤问题
问题原因分析
- 第一次尝试失败:
homeML为字符串类型,直接使用BetweenOperator和数值比较时,DevExpress会按照字符串的字典序进行匹配而非数值大小,因此无法得到正确的筛选结果。 - 第二次尝试报错的两个诱因:
- DevExpress Criteria语法不支持直接调用.NET的
Convert.ToInt16方法,需使用框架内置的类型转换函数 - 第二个转换语句的括号未闭合,存在语法错误
- DevExpress Criteria语法不支持直接调用.NET的
正确实现方案
写法1:使用CriteriaOperator.Parse(语法更简洁)
使用DevExpress内置的ToInt转换函数,同时可以直接用Between关键字简化范围判断逻辑:
int ii = 100; int jj = 105; // 写法A:用AND拆分判断 RangeCollection.Filter = CriteriaOperator.Parse("ToInt([homeML]) > ? AND ToInt([homeML]) < ?", ii, jj); // 写法B:用Between更简洁(包含边界值,等价于>=和<=) RangeCollection.Filter = CriteriaOperator.Parse("ToInt([homeML]) Between (?, ?)", ii, jj);
如果需要兼容homeML存在非数字格式的脏数据场景,可以加上IsNumeric判断避免转换异常:
RangeCollection.Filter = CriteriaOperator.Parse("IsNumeric([homeML]) AND ToInt([homeML]) Between (?, ?)", ii, jj);
写法2:强类型API写法(避免手写字符串语法错误)
通过FunctionOperator显式声明转换逻辑,再搭配BetweenOperator完成范围筛选:
int ii = 100; int jj = 105; // 声明属性转换逻辑 CriteriaOperator convertExpr = new FunctionOperator(FunctionOperatorType.ToInt, new OperandProperty("homeML")); // 构建范围筛选条件 CriteriaOperator filter = new BetweenOperator(convertExpr, new OperandValue(ii), new OperandValue(jj)); RangeCollection.Filter = filter;
内容的提问来源于stack exchange,提问作者Trey Balut
相关产品推荐
相关产品推荐

