4

我想在 NHibernate 中编写一个投影查询,按日期对记录进行分组并计算这些记录的“税”字段值。我的问题是数据库的值为 DateTime,我将如何仅按日期而不是时间对记录进行分组。下面是我的代码

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

数据库将 IssueDatetime 字段存储为 DateTime 类型。我想计算每个日期的税并忽略时间部分。有人可以帮我解决上述要求吗?

4

2 回答 2

8

对第一个投影使用以下内容:

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")))
于 2010-12-08T23:41:57.610 回答
2

假设 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])
于 2010-12-08T23:57:53.213 回答