Y a-t-il des projections d'opération arithmétique dans NHibernate?
-
26-10-2019 - |
Question
Je voudrais obtenir ce SQL de NHibernate:
SELECT SUM(color_pages) * SUM(total_pages)
FROM connector_log_entry
GROUP BY department_name
Mais je ne peux pas trouver une opération arithmétique (*) projections partout.
Voici le code que j'ai jusqu'à présent:
Session.QueryOver<ConnectorLogEntry>()
.SelectList(list => list
.SelectGroup(m => m.DepartmentName)
.WithAlias(() => dto.Department)
.Select(Projections.Sum<ConnectorLogEntry>(m => m.TotalPages))
//.Select(Projections.Sum<ConnectorLogEntry>(m => m.ColorPages))
.WithAlias(() => dto.TotalColorPercentage))
.TransformUsing(Transformers.AliasToBean<DepartmentConsumption>());
La solution
Les opérateurs arithmétiques peuvent être utilisés dans criteria via la fonction VarArgsSQLFunction
SQL. Dans votre cas, cela ressemblerait à quelque chose comme:
Session.QueryOver<ConnectorLogEntry>()
.SelectList(list =>
list.SelectGroup(m => m.DepartmentName)
.WithAlias(() => dto.Department)
.Select(Projections.SqlFunction(
new VarArgsSQLFunction("(", "*", ")"),
NHibernateUtil.Int32,
Projections.Sum<ConnectorLogEntry>(m => m.TotalPages),
Projections.Sum<ConnectorLogEntry>(m => m.ColorPages)))
.WithAlias(() => dto.TotalColorPercentage))
.TransformUsing(Transformers.AliasToBean<DepartmentConsumption>());
Cette technique injecte des chaînes directement dans le SQL généré, vous devrez vous assurer que la base de données sous-jacente prend en charge les opérateurs que vous utilisez.
Autres conseils
Il est trivial avec LINQ ou HQL, mais les critères et QueryOver ne sont pas optimisés pour cela (vous devez utiliser une projection SQL)
HQL est presque le même que SQL:
select sum(ColorPages) * sum(TotalPages)
from ConnectorLogEntry
group by DepartmentName
LINQ n'est pas difficile non plus:
from entry in Session.Query<ConnectorLogEntry>()
group entry by entry.DepartmentName into g
select g.Sum(e => e.ColorPages) * g.Sum(e => e.TotalPages)