Может ли синтаксис QueryOver NHibernate выбрать MAX () для SqlFunction? - PullRequest
3 голосов
/ 29 июля 2011

Я зарегистрировал функцию SQL в моем подклассе диалекта

RegisterFunction("addseconds", new SQLFunctionTemplate(NHibernateUtil.Date, "dateadd(second, ?1, ?2)"));

, которую можно использовать в таких запросах, как

var q = _session.QueryOver<Event>()
    .Select(
        Projections.SqlFunction(
            "addseconds",
            NHibernateUtil.Date,
            Projections.Property<Event>(x => x.DurationInSeconds),
            Projections.Property<Event>(x => x.StartTime)));

, создающих SQL

SELECT dateadd(second,
               this_.DurationInSeconds,
               this_.StartTime) as y0_
FROM   [Event] this_

но то, что я действительно ищу, это

SELECT MAX(dateadd(second,
               this_.DurationInSeconds,
               this_.StartTime)) as y0_
FROM   [Event] this_

к сожалению, я не могу заставить SelectMax использовать функцию Projection.SqlFunction.Можно ли это сделать?

1 Ответ

7 голосов
/ 29 июля 2011

Вам нужно обновить NHUtil до DateTime:

RegisterFunction("addseconds", new SQLFunctionTemplate(NHibernateUtil.DateTime, "dateadd(second, ?1, ?2)"));

В противном случае вы будете иметь дело только с частью Date.

Ваш запрос в порядке, вам просто нужно обернуть его в Projection.Max () примерно так:

var q = _session.QueryOver<Event>()
                .Select(Projections.Max(Projections.SqlFunction(
                        "addseconds",
                        NHibernateUtil.DateTime,
                        Projections.Property<Event>(y => y.DurationInSeconds),
                        Projections.Property<Event>(y => y.StartTime))))
                .SingleOrDefault<DateTime>();

Я просто быстро написал тест (иное название, чем указано выше) иэто произвело запрос:

SELECT max(dateadd(second,
                   this_.DurationInSeconds,
                   this_.SomeDate)) as y0_
FROM   Employee this_
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...