NHibernate - самый простой способ сделать LIKE поиск по целочисленному столбцу с Criteria API? - PullRequest
10 голосов
/ 05 августа 2009

Я пытаюсь выполнить поиск по столбцу целых чисел, мне нужно на самом деле привести столбец к varchar и затем выполнить поиск по аналогии. Это возможно? Какой самый простой способ сделать это с помощью API Criteria?

var search = "123";
criteria.Add(Restrictions.Like("Number", "%" + search + "%"))

1 Ответ

24 голосов
/ 05 августа 2009

Если бы Number был строкой, то было бы просто:

.Add(Restrictions.Like("Number", "some_value",MatchMode.Anywhere))

Поскольку у вас есть число, NHibernate проверит тип Number и, если вы укажете ему строку, выдаст исключение.

Не уверен, почему команда NH не предоставила перегрузку с объектом в качестве параметра и параметрами MatchMode ....

Во всяком случае, вы все еще можете сделать это так:

.Add(Expression.Sql("{alias}.Number like ?", "%2%", NHibernateUtil.String))

Редактировать

О псевдониме:

(я не могу найти, где документация говорит об этом, но вот мое понимание этого)

{псевдоним} возвращает псевдоним, используемый внутри NH для самого последнего CreateCriteria. Так что, если у вас было:

session.CreateCriteria<User>("firstAlias")
       .CreateCriteria("firstAlias.Document", "doc")
       .Add(Expression.Sql("{alias}.Number like ?", "%2%",  
                           NHibernateUtil.String)).List<User>();

{псевдоним} в этом случае будет 'doc' - поэтому вы получите: doc.Number.

Итак, всегда используйте {псевдоним} после CreateCriteria, псевдоним которого вам нужно использовать.

...