Existe-t-il des projections d’opérations arithmétiques dans NHibernate?

J’aimerais obtenir ce code SQL de NHibernate:

SELECT SUM(color_pages) * SUM(total_pages) FROM connector_log_entry GROUP BY department_name 

Mais je ne trouve aucune projection d’opération arithmétique (*).

C’est le code que j’ai jusqu’à présent:

 Session.QueryOver() .SelectList(list => list .SelectGroup(m => m.DepartmentName) .WithAlias(() => dto.Department) .Select(Projections.Sum(m => m.TotalPages)) //.Select(Projections.Sum(m => m.ColorPages)) .WithAlias(() => dto.TotalColorPercentage)) .TransformUsing(Transformers.AliasToBean()); 

Les opérateurs arithmétiques peuvent être utilisés dans les requêtes de critères via la fonction SQL VarArgsSQLFunction . Dans votre cas particulier, cela ressemblerait à quelque chose comme:

 Session.QueryOver() .SelectList(list => list.SelectGroup(m => m.DepartmentName) .WithAlias(() => dto.Department) .Select(Projections.SqlFunction( new VarArgsSQLFunction("(", "*", ")"), NHibernateUtil.Int32, Projections.Sum(m => m.TotalPages), Projections.Sum(m => m.ColorPages))) .WithAlias(() => dto.TotalColorPercentage)) .TransformUsing(Transformers.AliasToBean()); 

Cette technique injecte des chaînes directement dans le code SQL généré. Vous devez donc vous assurer que la firebase database sous-jacente prend en charge les opérateurs que vous utilisez.

C’est sortingvial avec LINQ ou HQL, mais Criteria et QueryOver ne sont pas optimisés pour cela (vous devez utiliser une projection SQL)

HQL est presque identique à SQL:

 select sum(ColorPages) * sum(TotalPages) from ConnectorLogEntry group by DepartmentName 

LINQ n’est pas difficile non plus:

 from entry in Session.Query() group entry by entry.DepartmentName into g select g.Sum(e => e.ColorPages) * g.Sum(e => e.TotalPages)