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>());
Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top