关于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
对象。我已经看到了很多关于如何编写一个列的示例,甚至还有一些将两列添加到一起的示例,但没有收集两个不同摘要并将它们转储到非域对象中的示例。
这可能吗?我该怎么做?
答案 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>();