我是NHibernate的新手,到目前为止一切都进展顺利,但我遇到了一个问题,我不确定如何解决问题.基本上我需要通过用户定义函数的输出进行过滤.如果我在sql中写这是我写的:
declare @Latitude decimal declare @Longitude decimal declare @radius int set @Latitude = -118.4104684 set @Longitude = 34.1030032 select * from store where dbo.CalculateDistance([Latitude],[Longitude],@Latitude,@Longitude) < @radius
我已经看到了我认为不合适的公式属性,命名查询和创建自己的方言扩展的例子(这似乎有点过分了).我会认为有更直接的方式,但我似乎无法找到一个整洁的例子.
解决方法
您可以在hibernate查询中使用sql表达式.假设您已映射了Store类型,则可以编写以下查询:
var result = session .CreateCriteria<Store>() .Add(Expression.sql( "dbo.CalculateDistance({alias}.Latitude,{alias}.Longitude,?,?) < ?",new object[] { -118.4104684d,34.1030032d,100 },new IType[] { NHibernateUtil.Double,NHibernateUtil.Double,NHibernateUtil.Int32 } )) .List<Store>();