Усеченные значения NHibernate при использовании ограничений с «Like» - PullRequest
0 голосов
/ 17 января 2012

У меня есть система, использующая автоматическое сопоставление Fluent NHibernate. У меня есть строковое свойство, сопоставленное с длиной 3.

mapping.Map(x => x.CCY1Code).Length(3);

Вот пример ограничения, которое я строю:

Restrictions.Like("CCY1Code", "USD", MatchMode.Anywhere);

Наблюдая за этим в SQL Server Profiler, похоже, что NHibernate параметризует SQL. Но при этом он ограничивается тремя символами. Но NHibernate также окружает мое значение "USD" знаками процента. То, что должно быть "% USD%", усекается до "% US". Вот некоторые фрагменты из SQL Server Profiler:

CCY1Code like @p9
@p9 nvarchar(3)
@p9=N'%US'

Кроме того, чтобы обойти это поле до пяти символов, есть ли другой способ решения этой проблемы?

1 Ответ

4 голосов
/ 17 января 2012

Я бы сказал, что это частично ошибка.

Бессмысленно искать с Like в 3-символьном поле, если токен имеет длину 3 символа. Вместо этого используйте Equals, чтобы использовать индексы (если они есть).

При поиске «% US%» вы попадете на ошибку, но обходным решением будет выполнить запрос следующим образом:

Restrictions.Like("CCY1Code", "US", MatchMode.Start) 
      || Restrictions.Like("CCY1Code", "US", MatchMode.End)

Это лучше, потому что первая часть также использует преимущества индексов, избегая усечения

EDIT: Я просто хотел бы добавить, что это определенно ошибка со стороны NHibernate, поскольку вы также можете Like использовать различные выражения, как описано в http://msdn.microsoft.com/en-us/library/ms179859.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...