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中执行此操作,好问题。