我对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
我已经看到了我认为不合适的公式属性,命名查询和创建自己的方言扩展的例子(这看起来有点过分了)。我原本以为有更直接的方式去做,但我似乎无法找到一个整洁的例子。
答案 0 :(得分:7)
您可以在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>();
答案 1 :(得分:4)
创建自定义方言扩展非常简单:
public class CustomFunctionsMsSql2005Dialect : MsSql2005Dialect
{
public CustomFunctionsMsSql2005Dialect()
{
RegisterFunction("calculatedistance",
new SQLFunctionTemplate(NHibernateUtil.Int32,
"CalculateDistance(?1, ?2, ?3, ?4)"));
}
}
注册,如下:
<property name="hibernate.dialect">
CustomFunctionsMsSql2005Dialect, MyAssembly
</property>
现在,您可以像使用session.CreateQuery()
创建的查询中的任何其他HQL函数一样使用它。