2011-08-31 44 views
0

有沒有辦法使用Linq到NHibernate一次選擇多個總和?Linq NHibernate:一次選擇多個總和

現在我有

int? wordCount = (from translation in session.Query<TmTranslation>() 
        where translation.SatisfiesCondition 
        select translation.TranslationUnit) 
       .Sum(x => (int?)(x.WordCount + x.NumberCount)) ?? 0; 

int? tagCount = (from translation in session.Query<TmTranslation>() 
       where translation.SatisfiesCondition 
       select translation.TranslationUnit) 
       .Sum(x => (int?)(x.TagCount)) ?? 0; 

int? characterCount = (from translation in session.Query<TmTranslation>() 
         where translation.SatisfiesCondition 
         select translation.TranslationUnit) 
         .Sum(x => (int?)(x.CharacterCount)) ?? 0; 

產生三種不同的SQL查詢。在SQL中,我可以一次抓住所有三個,但有沒有辦法在Linq中對NHibernate做這件事?

謝謝。

+0

見http://stackoverflow.com/questions/154680/linq-query-with-multiple-aggregates –

+0

你想在一個查詢3個款項,或在一次旅行發送到服務器的所有3個查詢?無論哪種方式都可以使用QueryOver。 – dotjoe

+0

@dotjoe這將是偉大的,你有一些例子如何做到這一點?我使用QueryOver寫了一些查詢,但是當我需要更復雜的東西時,我通常會發現它非常複雜,官方文檔也沒有多大幫助。 – twoflower

回答

1

已經發送到數據庫的Select()通話內容和成果在一個單一的SQL命令中的多個集合函數。例如:

var result = session.Query<TmAssignment>() 
        .Select(a => new 
        { 
         Words = session.Query<TmTranslation>().Where(s => s.Assignment == a).Sum(u => (int?) u.WordCount) ?? 0, 
         Others = session.Query<TmTranslation>().Where(s => s.Assignment == a).Sum(u => (int?)(u.TagCount + u.NumberCount)) ?? 0, 
        }).ToList(); 
+2

很高興看到您的解決方案 – adriaanp

+0

Soooo ...你的答案是什麼?我從來沒有低調過,但這不是一個有用的答案。 – mcfea

+0

@mcfea你說得對。我擴大了我的答案。 – twoflower

1

這應該幫助您開始使用QueryOver方式...

ResultDTO dtoAlias = null; //placeholder alias variable 

var dto = session.OueryOver<TmTranslation>() 
    .Where(x => x.SatisfiesCondition) 
    //Change this to the actual type of Translation property 
    .JoinQueryOver<Translation>(x => x.Translation) 
    .SelectList(list => list 
     //we can sum these columns individually to keep query simple,...add them together later 
     .SelectSum(x => x.WordCount).WithAlias(() => dtoAlias.WordCountTotal) 
     .SelectSum(x => x.NumberCount).WithAlias(() => dtoAlias.NumberCountTotal) 
     //add more select sums to the select list 
     ) 
    .TransformUsing(Transformers.AliasToBean<ResultDTO>()) 
    .SingleOrDefault<ResultDTO>();