Linq to NHibernate: выберите несколько сумм одновременно - PullRequest
0 голосов
/ 31 августа 2011

Есть ли способ выбрать несколько сумм одновременно, используя 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?

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 августа 2012

Наличие нескольких агрегатных функций в вызове 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();
1 голос
/ 01 сентября 2011

это должно помочь вам начать работу с 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>();
...