Sql server 使用NHibernate.Linq查询时如何查询包含方括号的数据

Sql server 使用NHibernate.Linq查询时如何查询包含方括号的数据,sql-server,tsql,nhibernate,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

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

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]' + '%')
这不会返回任何结果,因为SQLServer认为是括号内任意一个字符的正则表达式匹配的开始。这只是SQL Server的一个问题,PL SQL不考虑[是一个特殊字符。

提到限制的重载。比如允许传递转义字符,但我无法控制NHibernate.Linq中使用的代码部分


我知道我可以做一个搜索词。在我的代码中替换[,[];但我一直在寻找一个更通用的解决方案,例如,将它添加到Hibernate.dialent.mssql2000dialent,因为它只适用于SQL Server。

基于@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);
    }
请参阅此答案和注释,了解如何在CriteriaAPI中转义表达式。我不知道如何在LINQ中执行此操作,好问题。