使用带有“Like”的限制时NHibernate截断值

时间:2012-01-17 04:34:18

标签: nhibernate fluent-nhibernate

我有一个使用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'

除了将我的字段延长到五个字符以解决此问题之外,还有其他方法可以解决此问题吗?

1 个答案:

答案 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

中描述的各种表达式