【问题标题】:Nhibernate filtering by user defined function output通过用户定义的函数输出进行休眠过滤
【发布时间】:2009-11-10 07:50:49
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以在休眠查询中使用 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>();
    

    【讨论】:

      【解决方案2】:

      创建自定义方言扩展相当简单:

      public class CustomFunctionsMsSql2005Dialect : MsSql2005Dialect 
      { 
         public CustomFunctionsMsSql2005Dialect() 
         { 
            RegisterFunction("calculatedistance",
                             new SQLFunctionTemplate(NHibernateUtil.Int32,
                                                     "CalculateDistance(?1, ?2, ?3, ?4)"));
         }
      }
      

      注册它,像这样:

      <property name="hibernate.dialect">
        CustomFunctionsMsSql2005Dialect, MyAssembly
      </property>
      

      现在您可以像使用任何其他 HQL 函数一样在使用 session.CreateQuery() 创建的查询中使用它。

      【讨论】:

      • 感谢 asbjornu。并不是我认为这一定很难,考虑到这可能是我唯一需要做这种事情的地方,这似乎有点过头了。不过,我会在未来的项目中记住这一点。我仍在学习什么是合适的,什么时候合适。
      • 实际上,当决定我们也需要输出中的值时,我最终使用了这种方法。技术真的很棒,加油!几乎副本和过去唯一缺少的是对“dbo”的要求。在函数的开头。
      猜你喜欢
      • 1970-01-01
      • 2016-01-05
      • 2015-12-25
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2011-09-26
      相关资源
      最近更新 更多