使用NHibernate.Linq Query <t> </t>时如何查询包含方括号的数据

时间:2012-11-09 13:40:30

标签: sql-server tsql nhibernate

我的数据库中的某些记录包含方括号,例如

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。

1 个答案:

答案 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);
    }