Фильтрация Nhibernate по выводу пользовательских функций - PullRequest
4 голосов
/ 10 ноября 2009

Я довольно новичок в 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 ]

7 голосов
/ 10 ноября 2009

Вы можете использовать выражение 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>();
4 голосов
/ 10 ноября 2009

Создание пользовательских расширений диалекта довольно просто:

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().

...