2013-03-25 3 views
1

Ни один из так же формулировками вопросов на SO не кажется, совпадают, и прибегая к помощи довольно много очков SO для этого, так что давайте попробуем это:(N) Hibernate Criteria: суммируя несколько отдельных столбцов

У меня есть класс с 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, который вернет суммы как свойства Credits, так и свойства Debits. 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

Это выглядит многообещающим! Я попробую это и дам вам знать. –

+0

@JeremyHolovacs Я забыл добавить псевдонимы проектов. Без них трансформатор результата не работает. Я редактировал свой пост. – Vasea

+0

Я предполагаю, что на самом деле это будет 'UniqueResult ', а не 'List '? Или я беру '.SingleOrDefault()' после факта? –

Смежные вопросы