2013-03-25 44 views
1

沒有對這樣類似的措詞問題似乎匹配,而谷歌搜索相當多的點,所以讓我們試試這個:(N)Hibernate的標準:對於這個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; } 
} 

我希望做的是寫一個Crite ria查詢將返回信用屬性和借方資產的總和。 IOW,我想的東西隱約形這樣的SQL查詢:

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

...並有填充我JournalEntrySummary對象。我看過很多關於如何做一列的例子,甚至還有一些將兩列加在一起的例子,但沒有收集兩個不同摘要並將它們轉儲到非域對象中的例子。

這可能嗎?我會怎麼做?

回答

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>(); 
+0

這看起來很有希望!我會試試這個,讓你知道。 – 2013-03-25 13:32:28

+0

@JeremyHolovacs我忘了添加投影別名。沒有這些結果轉換器不起作用。我編輯了我的帖子。 – Vasea 2013-03-25 13:55:16

+0

我認爲這實際上是一個'UniqueResult '而不是'List '?或者事實之後我有'.SingleOrDefault()'? – 2013-03-25 15:28:04