使用带有SQLite的ServiceStack OrmLite时,如何转义特殊字符?

时间:2014-05-01 15:55:39

标签: c# sqlite servicestack ormlite-servicestack

我们有一段代码,我们尝试将模式与数据库中的数据进行匹配。

我们对SQLite DB使用ServiceStack.OrmLite。

例如,给出以下记录:

ColA    ColB
-----   ---------
ABC     ABC_Long
GHI     GHI_Long
GHIP    GHIP_Long

我们使用谓词:

var result = db.Select(x => x.ColA.StartsWith("GHI_")); 

一切正常,直到我们的搜索模式包含SQL特殊字符,例如'%'或者' _'例如,考虑到" GHI _":

的搜索模式

预期的行应为:

GHI     GHI_Long

但是我们得到:

GHI     GHI_Long
GHIP    GHIP_Long

这是由于ORMLite没有转义特殊字符并生成以下SQL:

SELECT * FROM myTable WHERE UPPER(colA) LIKE 'GHI_%' OR UPPER(colB) LIKE 'GHI_%';

而不是正确的转义版本应该是:

SELECT * FROM myTable WHERE UPPER(colA) LIKE 'GHI\_%' OR UPPER(colB) LIKE 'GHI\_%' ESCAPE '\';

你能想出解决这个问题的方法吗?

2 个答案:

答案 0 :(得分:3)

我刚刚添加了对escaping wildcards in this commit的隐式支持,它现在将在使用LIKE的类型化表达式中转义通配符,即StartsWithEndsWith和{{ 1}},例如:

Contains

这将在 v4.0.19 中提供,即now available on MyGet

答案 1 :(得分:2)

OrmLite没有内置的功能,但它确实允许您在需要时轻松提供正确的SQL。你可以简单地做这样的事情:

var notes = db.Select<NoteDto>(" upper(\"NoteText\") like 'GHI@_%' ESCAPE '@' ");

通过这种方式,你只需要编写where子句,你仍然可以获得DTO自动填充的好处。

为了清楚起见,我更改了转义符,并证明它可以是SQLite中的任何内容。