ServiceStack OrmLite 错误 SQL?

ServiceStack OrmLite wrong SQL?

我有以下 class:

    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 => inst.ProcessDefinitionId == id 给出正确的 SLQ:

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

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

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