NHibernate proiezione interroga gruppo per data
-
10-10-2019 - |
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?
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