2011-01-28 30 views
6

我想从NHibernate的得到这个SQL:NHibernate中是否有算术运算投影?

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

但我找不到任何地方的任何算术运算(*)的预测。

这是代码,我到目前为止有:

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

即使你可以用ICriteria来完成它,hql查询也会更具可读性。 – Sly 2011-01-28 14:04:34

回答

8

通过VarArgsSQLFunction SQL函数,可以在条件查询中使用算术运算符。在您的特定情况下,这看起来是这样的:

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

这种技术注入字符串直接进入生成的SQL,所以你需要确保底层数据库支持您使用的运营商。

2

它的琐碎与LINQ或HQL,但标准和QueryOver不为优化(你必须使用一个SQL投影)

HQL是几乎相同的SQL:

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

LINQ不难之一:

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

这个查询在我的问题中只是一小部分。我真正的查询要困难得多,我在这里写了,而且我已经用QueryOver完成了所有的查询,将所有的查询都移到hql或linq中会很困难并且有问题。 – 2011-01-29 17:32:17

+0

太糟糕了。然后使用SQL投影。祝你好运。 – 2011-01-30 02:13:37