如何在Orchard Core SQL查询select子句中使用算术运算符
问题根因
Orchard Core 自带的SqlParser是做了语法裁剪的安全解析器,没有实现完整SQL-92标准,它对SELECT子句的首元素做了白名单限制,只识别ALL、DISTINCT、字段名、*几类值。你写的语句在第0行第7列(也就是左括号(位置)触发了解析规则不匹配,所以抛出语法错误,这个问题和底层SQLite数据库无关,是上层ORM解析层的限制。
可用的正确写法
不需要调整运算逻辑,只要调整表达式的书写格式绕过解析限制即可,两种写法都可以正常执行:
- 写法1:给运算里的字段加上表名前缀,是最推荐的无副作用写法
select (BlogPostStatsPartIndex.Rating * 100.0) as ratingCalc from BlogPostStatsPartIndex;
- 写法2:在括号表达式前加不影响计算结果的正号
+,写法更简洁
select +(Rating * 100.0) as ratingCalc from BlogPostStatsPartIndex;
补充说明
- 这个解析限制是Orchard Core为了拦截SQL注入风险,对用户输入的SQL做语法白名单校验带来的副作用
- 目前官方源码里的
SqlParserTests确实没有覆盖「SELECT后直接跟括号包裹的算术表达式」场景,你没找到对应示例是正常的 - 所有加减乘除、取模类算术运算,如果直接以括号开头放在SELECT子句首位,都会触发同类报错,按上述格式调整即可
内容的提问来源于stack exchange,提问作者v.vyhonskyi
相关产品推荐
相关产品推荐

