【问题标题】:(N)Hibernate Criteria: summing multiple distinct columns(N)Hibernate Criteria:对多个不同的列求和
【发布时间】:2013-03-14 09:58:25
【问题描述】:

关于 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; }
}

我想做的是编写一个条件查询,它将返回 Credits 属性和 Debits 属性的总和。 IOW,我想要一些形状像这个 SQL 查询的东西:

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

... 并让它填充我的 JournalEntrySummary 对象。我看过很多关于如何做一列的例子,甚至还有一些将两列加在一起的例子,但没有收集两个不同的摘要并将它们转储到非域对象中的例子。

这可能吗?我该怎么做?

【问题讨论】:

    标签: c# hibernate nhibernate orm criteria


    【解决方案1】:

    查看标准查询文档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>();
    

    【讨论】:

    • 这看起来很有希望!我会试试这个,让你知道。
    • @JeremyHolovacs 我忘了添加投影别名。没有这些,结果转换器将无法工作。我已经编辑了我的帖子。
    • 我认为这实际上是UniqueResult&lt;JournalEntrySummary&gt; 而不是List&lt;JournalEntrySummary&gt;?还是我在事后采取了.SingleOrDefault()
    • @JeremyHolovacs 是的,你应该打电话给UniqueResult&lt;&gt;。但是,如果您有一个 group by 参与查询,您将使用 List&lt;&gt;
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多