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 => 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 Webhook + ServiceStack.Webhooks.OrmLite 订阅商店插件问题