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 应该是直观的。它不支持魔术行为,例如使用引用复杂类型 属性 尝试查询任何嵌套对象,即您只能像在第二个查询中那样查询直接列属性。
我有以下 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 应该是直观的。它不支持魔术行为,例如使用引用复杂类型 属性 尝试查询任何嵌套对象,即您只能像在第二个查询中那样查询直接列属性。