1

关于 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对象。我看过很多关于如何做一列的例子,甚至还有一些将两列加在一起的例子,但没有收集两个不同的摘要并将它们转储到非域对象中的例子。

这可能吗?我该怎么做?

4

1 回答 1

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>();
于 2013-03-25T13:07:09.613 回答