Domanda

Voglio scrivere una query di proiezione in NHibernate che raggruppa i record per data e conta il valore del campo "tassa" per i record. La mia domanda è che il database ha il valore di DateTime, come farò a raggruppare i record solo per data e non time.Below è il mio codice

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

Il database memorizza il campo IssueDatetime come tipo DateTime. Voglio contare la tassa per ogni data e ignorare la parte di tempo. Qualcuno può aiutarmi a uscire con il requisito di cui sopra?

È stato utile?

Soluzione

Utilizza il seguente per la prima proiezione:

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

Per NH 2.x:

Projections.GroupProperty(
    Projections.SqlFunction(new SQLFunctionTemplate(
                                NHibernateUtil.Date,
                                "dateadd(dd, 0, datediff(dd, 0, ?1))"),
                            NHibernateUtil.Date,
                            Projections.GroupProperty("IssueDateTime")))

Altri suggerimenti

Supponendo di SQL Server e T-SQL, questo ICriteria lo farà.

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

viene generato il seguente SQL.

SELECT CONVERT(date, this_.[IssueDatetime]) AS [DateVal], sum(this_.Tax) as y1_ FROM IgnoreTime_Record this_ GROUP BY CONVERT(date, this_.[IssueDatetime])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top