我们有一段代码,我们尝试将模式与数据库中的数据进行匹配。
我们对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 '\';
你能想出解决这个问题的方法吗?
答案 0 :(得分:3)
我刚刚添加了对escaping wildcards in this commit的隐式支持,它现在将在使用LIKE
的类型化表达式中转义通配符,即StartsWith
,EndsWith
和{{ 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中的任何内容。