1

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

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。

4

1 回答 1

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);
    }
于 2019-03-21T15:09:02.180 回答