NHibernate allows adding multiple aggregations at the same time for a single ICriteria and generates multiple objects. Below sample shows how this can be achieved
using (var session = _sessionFactory.OpenSession()) { ICriteria criteria = session.CreateCriteria(typeof(InvoiceLine)); criteria.Add(Restrictions.WhereNow you have got some list of objects which you can convert to your desired type. So you have to manually covert them, how about if NHibernate does this for you. First create a summary class which does not need to be part of you database(i => i.Invoice.ID == 1234)); criteria.SetProjection(Projections.ProjectionList() .Add(Projections.Count("ID")) .Add(Projections.Sum("Price")) .Add(Projections.Sum("Quantity")); object[] retObjects = (object[])criteria.UniqueResult(); }
public class InvoiceSummary { public int LineCount; public long LineTotalPrice; public long TotalQuantity; }Now populate the data
using (var session = _sessionFactory.OpenSession()) { ICriteria criteria = session.CreateCriteria(typeof(InvoiceLine)); criteria.Add(Restrictions.WhereNHibernate.Transform.Transformers.AliasToBean does the job of using the alias names to assign the properties of InvoiceSummary object Technological progress has merely provided us with more efficient means for going backwards. ~Aldous Huxley(i => i.Invoice.ID == 1234)); criteria.SetProjection(Projections.ProjectionList() .Add(Projections.Count("ID").As("LineCount")) .Add(Projections.Sum("Price").As("LineTotalPrice")) .Add(Projections.Sum("Quantity").As("TotalQuantity"))); .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(InvoiceSummary))); InvoiceSummary summary = (InvoiceSummary)criteria.UniqueResult(); }