我有一个使用Fluent NHibernate自动映射的系统。我有一个字符串属性,其长度为3。
mapping.Map(x => x.CCY1Code).Length(3);
以下是我正在构建的限制示例:
Restrictions.Like("CCY1Code", "USD", MatchMode.Anywhere);
在SQL Server Profiler中看到这一点,看起来NHibernate正在参数化SQL。但这样做会将其限制为三个字符。但是NHibernate也用百分号围绕着我的价值“美元”。那么应该将“%USD%”截断为“%US”。以下是SQL Server Profiler的一些代码:
CCY1Code like @p9
@p9 nvarchar(3)
@p9=N'%US'
除了将我的字段延长到五个字符以解决此问题之外,还有其他方法可以解决此问题吗?
答案 0 :(得分:4)
我会说这部分是个错误。
当令牌本身长度为3个字符时,在3个字符的字段上使用Like
进行搜索是没有意义的。请改用Equals
,以便利用索引(如果有任何设置)。
在搜索“%US%”时,您会遇到错误,但解决方法是将查询运行为:
Restrictions.Like("CCY1Code", "US", MatchMode.Start)
|| Restrictions.Like("CCY1Code", "US", MatchMode.End)
这是更好的,因为第一部分也利用索引,同时避免截断
编辑:
我想在此添加,这绝对是NHibernate的一个错误,因为你也可以Like
使用http://msdn.microsoft.com/en-us/library/ms179859.aspx