2011-05-09 5 views
2

У меня есть функция поиска NHibernate, где я получаю целые числа и хочу возвращать результаты, где по крайней мере начало совпадает с целыми числами, например.NHibernate Как с целым числом

получил целое число: 729
возвращается: 729445, 7291 и т.д.

столбец базы данных имеет тип INT, как это свойство "Id" из Foo.

Но

int id = 729; 

var criteria = session.CreateCriteria(typeof(Foo)) 

criteria.Add(NHibernate.Criterion.Expression.InsensitiveLike("Id", id.ToString() + "%")); 

return criteria.List<Foo>(); 

действительно приводит к ошибке (Не удалось преобразовать строку параметров в int32). Что-то не так в коде, работа или другое решение?

ответ

3

AFAIK, вам нужно сохранить целое число в виде строки в базе данных, если вы хотите использовать встроенную функциональность NHibernate для этого (я бы рекомендовал этот подход даже без NHibernate - в тот момент, когда вы начинаете делать «как», поиски вы имеете дело со строкой, а не с номером - считайте US Zip Codes и т. д.).

Вы также можете сделать это математически в функции, специфичной для базы данных (или преобразовать в строку, как описано в Thiago Azevedo's answer), но я думаю, что эти параметры будут значительно медленнее, а также могут привязать вас к конкретной базе данных.

3

Вы пробовали что-то вроде этого:

int id = 729; 

var criteria = session.CreateCriteria(typeof(Foo)) 

criteria.Add(NHibernate.Criterion.Expression.Like(Projections.SqlFunction("to_char", NHibernate.NHibernateUtil.String, Projections.Property("Id")), id.ToString() + "%")); 

return criteria.List<Foo>(); 

Идея является преобразовать столбец перед использованием функции to_char. Некоторые базы данных делают это автоматически.

+0

При использовании этого подхода стоит отметить, что вы должны будете использовать to_char вашей базы данных эквивалентно – AlexCuse

+0

Это правильно @AlexCuse. В этом примере я использую oracle8iDialect. –

+0

Любая идея, что мне нужно написать с SQL Server 2008? – AGuyCalledGerald

7

Как об этом:

int id = 729; 

var criteria = session.CreateCriteria(typeof(Foo)) 
criteria.Add(Expression.Like(Projections.Cast(NHibernateUtil.String, Projections.Property("Id")), id.ToString(), MatchMode.Anywhere)); 

return criteria.List<Foo>(); 
Смежные вопросы