ServiceStack OrmLite SQL 错误?

Posted

技术标签:

【中文标题】ServiceStack OrmLite SQL 错误?【英文标题】:ServiceStack OrmLite wrong SQL? 【发布时间】:2021-11-03 18:32:25 【问题描述】:

我有以下课程:

    public class ProcessInstance
    
        [AutoIncrement]
        public int Id  get; set; 

        [Reference]
        public ProcessDefinition ProcessDefinition  get; set; 
        public int ProcessDefinitionId  get; set; 

        // and more...

然后运行以下,这对我来说很好:

var q = db.From<ProcessInstance>().Where(inst => inst.ProcessDefinition.Id == id
                && Sql.In(inst.Status, enProcessStatus.READY, enProcessStatus.ACTIVE));
return db.Exists(q);

当我从“db”对象中检查最后一个命令文本 SQL 时,它是错误的:

SELECT 'exists' 
FROM "ProcessInstance"
WHERE (("Id" = @0) AND "Status" IN (@1,@2))
LIMIT 1

请注意,它过滤的是Id 而不是ProcessDefinition.Id,这当然是错误的。不知道为什么会这样——至少我会很高兴得到一个错误而不是一个错误的结果。

但是,我找到了解决方法:使用 ProcessDefinitionId:Where(inst =&gt; inst.ProcessDefinitionId == id 给出正确的 SLQ:

SELECT 'exists' 
FROM "ProcessInstance"
WHERE (("ProcessDefinitionId" = @0) AND "Status" IN (@1,@2))
LIMIT 1

为什么第一个不起作用?为什么没有错误?

【问题讨论】:

【参考方案1】:

OrmLite 旨在提供围绕 SQL 表达式的类型化 api,以便直观地确定从类型化表达式生成的 SQL。它不支持魔术行为,例如尝试使用引用复杂类型属性查询任何嵌套对象,即您只能像在第二个查询中那样查询直接列属性。

【讨论】:

有限制是完全可以的,但是它只是进行另一个查询(查询另一个字段)并不是那么好,当然会导致错误。当然,人们可以说这是人为错误、错误使用等,我不反对,但是,一个例外而不是创建一个不同的 SQL 会很好。也许是未来的改进。

以上是关于ServiceStack OrmLite SQL 错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 和 ServiceStack.OrmLite 中使用架构名称

VeraCode 报告 ServiceStack OrmLite 对 SQL 命令中使用的特殊元素进行了不当中和(“SQL 注入”)(CWE ID 89)

ServiceStack OrmLite“喜欢”Linq

ServiceStack.OrmLite 调用存储过程

ServiceStack Webhook + ServiceStack.Webhooks.OrmLite 订阅商店插件问题

使用 ServiceStack.ORMLite 的存储库模式中的事务