【问题标题】:ServiceStack OrmLite wrong SQL?ServiceStack OrmLite 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

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

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

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

    【讨论】:

    • 有限制是完全可以的,但是它只是进行另一个查询(查询另一个字段)并不是那么好,当然会导致错误。当然,人们可以说这是人为错误、错误使用等,我不反对,但是,一个例外而不是创建一个不同的 SQL 会很好。也许是未来的改进。
    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多