我的数据库中的某些记录包含方括号,例如
dafalgan [1gram]
valium [15mg]
...
但是,当我想使用以下表达式
使用NHibernate.Linq查询时return x => x.Description.Contains(searchTerm)
其中searchTerm是'dafalgan [1gram]' 使用/生成以下SQL:
SELECT FieldName1, FieldName2
FROM TableName
WHERE (Description LIKE '%' + N'dafalgan [1gram]' + '%')
这不会返回任何结果,因为SQL Server认为[
是括号中任何一个字符的正则表达式匹配的开始。这只是SQL Server的一个问题,pl-sql不认为[
是一个特殊字符。
NH-938提到Restrictions.Like
的重载允许传递转义字符但我无法控制所使用的代码(NHibernate.Linq的一部分)。
我知道我可以在我的代码中执行searchTerm.Replace("[", "[[]");
但我正在寻找更通用的解决方案,例如。将它添加到Hibernate.Dialect.MsSql2000Dialect,因为它仅特定于SQL Server。
答案 0 :(得分:0)
基于@Jamie Ide的链接,以下对我有用:
private static AbstractCriterion MatchModeAnywhereSafeCriterion(string propertyName, string value)
{
const char escapeChar = '\u001B';
var safeValue = value.Replace("%", escapeChar + "%").Replace("_", escapeChar + "_")
.Replace("[", escapeChar + "[");
return Restrictions.Like(propertyName, safeValue, MatchMode.Anywhere, escapeChar);
}