Запросы NHibernate Projection группируются по дате - PullRequest
4 голосов
/ 08 декабря 2010

Я хочу написать запрос проекции в NHibernate, который группирует записи по дате и подсчитывает значение поля «Налог» для этих записей.Мой вопрос заключается в том, что база данных имеет значение как DateTime, как я буду группировать записи только по дате, а не по времени. Ниже приведен мой код

template.Criteria.SetProjection(
                Projections.ProjectionList()
                .Add(Projections.GroupProperty("IssueDatetime"), "DateVal")
                .Add(Projections.Sum("Tax"), "TotalFare")
            );

База данных хранит поле IssueDatetime как тип DateTime.Я хочу посчитать налог за дату и игнорировать часть времени.Кто-нибудь может мне помочь с вышеуказанным требованием?

Ответы [ 2 ]

8 голосов
/ 09 декабря 2010

Используйте следующее для первой проекции:

Projections.GroupProperty(
    Projections.SqlFunction("date",
                            NHibernateUtil.Date,
                            Projections.GroupProperty("IssueDateTime")))

Для NH 2.x:

Projections.GroupProperty(
    Projections.SqlFunction(new SQLFunctionTemplate(
                                NHibernateUtil.Date,
                                "dateadd(dd, 0, datediff(dd, 0, ?1))"),
                            NHibernateUtil.Date,
                            Projections.GroupProperty("IssueDateTime")))
2 голосов
/ 09 декабря 2010

Предполагая, что SQL Server и T-SQL, этот ICriteria сделает это.

IList results = Session.CreateCriteria(typeof(Record), "record")
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.SqlGroupProjection("CONVERT(date, {alias}.[IssueDatetime]) AS [DateVal]", "CONVERT(date, {alias}.[IssueDatetime])", new[] { "DateVal" }, new IType[] { NHibernateUtil.Date }))
        .Add(Projections.Sum("Tax"), "TotalFare"))
    .List();

Сгенерирован следующий SQL.

SELECT CONVERT(date, this_.[IssueDatetime]) AS [DateVal], sum(this_.Tax) as y1_ FROM IgnoreTime_Record this_ GROUP BY CONVERT(date, this_.[IssueDatetime])
...