NHibernate – самый простой способ выполнить поиск LIKE по целочисленному столбцу с помощью Criteria API?
-
22-07-2019 - |
Вопрос
Я пытаюсь выполнить аналогичный поиск по целочисленному столбцу, мне нужно фактически привести столбец к varchar, а затем выполнить аналогичный поиск.Это возможно?какой самый простой способ сделать это с помощью Criteria API?
var search = "123";
criteria.Add(Restrictions.Like("Number", "%" + search + "%"))
Решение
Если бы Number был строкой, это было бы легко:
.Add(Restrictions.Like("Number", "some_value",MatchMode.Anywhere))
Поскольку у вас есть число, NHibernate проверит тип номера, и если вы укажете ему строку, он выдаст исключение.
Не знаю, почему команда NH не предоставила перегрузку с объектом в качестве параметра и параметрами MatchMode....
В любом случае, вы все равно можете сделать это вот так:
.Add(Expression.Sql("{alias}.Number like ?", "%2%", NHibernateUtil.String))
Редактировать
О псевдониме:
(я не могу найти, где об этом говорится в документации, но вот мое понимание этого)
{alias} возвращает псевдоним, использованный внутри NH для самого последнего CreateCriteria.Итак, если у вас было:
session.CreateCriteria<User>("firstAlias")
.CreateCriteria("firstAlias.Document", "doc")
.Add(Expression.Sql("{alias}.Number like ?", "%2%",
NHibernateUtil.String)).List<User>();
{alias} в этом случае будет «doc», поэтому в итоге вы получите:номер документа.
Поэтому всегда используйте {alias} после CreateCriteria, псевдоним которого вам нужно использовать.