Linq to NHibernate:一次选择多个总和

问题描述 投票:0回答:3

是否有使用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 to NHibernate中有没有办法做到这一点?

谢谢。

sql nhibernate linq-to-nhibernate
3个回答
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>();

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

0
投票

我使用的可能更简单的解决方案是进行人工GroupBy,然后投影到匿名对象:

例如

session.Query<TmTranslation>()
  .Where(o => o.SatisfiesCondition)
  .Select(o => o.TranslationUnit)
  .GroupBy(o => 1)
  .Select(o => new 
   {
     WordCount = o.Sum(x => (int?)(x.WordCount + x.NumberCount)) ?? 0,
     TagCount = o.Sum(x => (int?)(x.TagCount)) ?? 0,
     CharacterCount = o.Sum(x => (int?)(x.CharacterCount)) ?? 0
   })
  .Single(); 

这也只产生一个SQL语句并很好地减少了重复。

© www.soinside.com 2019 - 2024. All rights reserved.