我有一个NHibernate搜索函数,我接收整数并希望返回结果,其中至少开头与整数重合,例如。
收到整数:729
返回:729445,7291等。
数据库列的类型为int,Foo的属性为“Id”。
但是
int id = 729;
var criteria = session.CreateCriteria(typeof(Foo))
criteria.Add(NHibernate.Criterion.Expression.InsensitiveLike("Id", id.ToString() + "%"));
return criteria.List<Foo>();
会导致错误(无法将参数字符串转换为int32)。代码,解决方法或其他解决方案是否有问题?
答案 0 :(得分: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>();
答案 1 :(得分:3)
AFAIK,你需要将整数作为字符串存储在数据库中,如果你想使用内置的NHibernate功能(即使没有NHibernate,我也会推荐这种方法 - 你开始做'喜欢'搜索的那一刻你正在处理一个字符串,而不是一个数字 - 想想美国邮政编码等...)。
您也可以在数据库特定的函数中进行数学处理(或转换为Thiago Azevedo's answer中描述的字符串),但我想这些选项会明显变慢,并且还有可能将您绑定到具体数据库。
答案 2 :(得分: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函数之前转换列。有些数据库会自动执行此操作。