通过用户定义的函数输出进行Nhibernate过滤

时间:2009-11-10 07:50:49

标签: sql-server-2005 nhibernate user-defined-functions

我对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

我已经看到了我认为不合适的公式属性,命名查询和创建自己的方言扩展的例子(这看起来有点过分了)。我原本以为有更直接的方式去做,但我似乎无法找到一个整洁的例子。

2 个答案:

答案 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函数一样使用它。