Пользовательская функция SQL для диалекта NHibernate - PullRequest
5 голосов
/ 04 декабря 2009

Я хочу иметь возможность вызывать пользовательскую функцию с именем «Recent_date» как часть моего HQL. Как это: [Date] >= recent_date()

Я создал новый диалект, унаследованный от MsSql2000Dialect, и указал диалект для моей конфигурации.

public class NordicMsSql2000Dialect : MsSql2000Dialect
{
    public NordicMsSql2000Dialect()
    {
        RegisterFunction(
            "recent_date",
            new SQLFunctionTemplate(
                NHibernateUtil.Date,
                "dateadd(day, -15, getdate())"
                )
            );
    }
}

var configuration = Fluently.Configure()
.Database(
    MsSqlConfiguration.MsSql2000
    .ConnectionString(c => .... )
    .Cache(c => c.UseQueryCache().ProviderClass<HashtableCacheProvider>())
    .Dialect<NordicMsSql2000Dialect>()
)
.Mappings(m => ....)
.BuildConfiguration();

При звонке recent_date() я получаю следующую ошибку: System.Data.SqlClient.SqlException: 'Recent_date' не является распознанным именем функции

Я использую его в операторе where для отображения HasMany, как показано ниже.

HasMany(x => x.RecentValues)
    .Access.CamelCaseField(Prefix.Underscore)
    .Cascade.SaveUpdate()
    .Where("Date >= recent_date()");

Что мне здесь не хватает?

Ответы [ 2 ]

3 голосов
/ 04 декабря 2009

Я думаю, Where - это оператор SQL, а не оператор HQL. Так что он не знает функцию. Работает только для HQL, в запросах или фильтрах.

1 голос
/ 19 декабря 2009

Я думал, что вы должны поставить перед вашей функцией префикс "dbo". всякий раз, когда вы использовали это. Мой собственный диалект имеет это:

RegisterFunction("dbo.isbounded", new SQLFunctionTemplate(NHibernateUtil.Double, "dbo.IsBounded(?1, ?2, ?3, ?4, ?5, ?6)"));

Затем вызывается с помощью

Expression.Sql("dbo.IsBounded(...)")
...