(N)Hibernate Criteria:汇总多个不同的列

时间:2013-03-25 00:48:03

标签: c# hibernate nhibernate orm criteria

关于SO的类似措辞问题似乎都没有匹配,并且谷歌搜索了相当多的SO,所以让我们试试这个:

我有一个JournalEntry实体类,如下所示:

public partial class JournalEntry
{
    public virtual Guid JournalEntryId { get; set; }

    public virtual Account Account { get; set; }

    public virtual decimal DebitAmount { get; set; }

    public virtual decimal CreditAmount { get; set; }

    [NotNull]
    public virtual DateTime EffectiveDate { get; set; }

    [NotNull]
    public virtual DateTime PostingDate { get; set; }

    public virtual UserProfile PostedBy { get; set; }

    [FullTextIndexed]
    public virtual string Notes { get; set; }

    public virtual Amortization Amortization { get; set; }

    public virtual ExpenseCategories ExpenseCategory { get; set; }

    [Index]
    public virtual bool IsClosed { get; set; }
}

我还有一个简单的类来保存交易摘要,如下所示:

public class JournalEntrySummary
{
    public decimal Credits { get; set; }
    public decimal Debits { get; set; }
}

我想要做的是写一个Criteria查询,它将返回Credits属性和Debits属性的总和。 IOW,我想像这个SQL查询一样模糊地形成:

select
    sum(creditamount) as Credits,
    sum(debitamount) as Debits
from 
    journalentries
where
    ...

...并填充我的JournalEntrySummary对象。我已经看到了很多关于如何编写一个列的示例,甚至还有一些将两列添加到一起的示例,但没有收集两个不同摘要并将它们转储到非域对象中的示例。

这可能吗?我该怎么做?

1 个答案:

答案 0 :(得分:2)

查看标准查询文档http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection,有一些示例可以回答您的问题。

对于你的例子,你应该试试这个

// using NHibernate.Criterion;
// using NHibernate.Transform;

session.CreateCriteria<JournalEntry>()
   .SetProjection(
       Projections.Sum<JournalEntry>(x => x.DebitAmount).As("Debits"),
       Projections.Sum<JournalEntry>(x => x.CreditAmount).As("Credits"),
       // you can use other aggregates
       // Projections.RowCount(),
       // Projections.Max<JournalEntry>(x => x.EffectiveDate)
    )
    .SetResultTransformer(Transformers.AliasToBean<JournalEntrySummary>())
    .UniqueResult<JournalEntrySummary>();