2011-01-28 18 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

答えて

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に直接文字列を挿入します。

+0

このソリューションが100%優れているかどうかを確認するための迅速な方法はありませんが、VarArgsSQLFunctionクラスのドキュメントを見ることで、それは私が1年前に探していたものだと確信しています:)将来他の人を助けるでしょう。 –

2

それはLINQやHQLと些細だが、基準とQueryOverはそのために最適化されていない(あなたはSQLプロジェクションを使用する必要があります)

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

LINQが難しいのいずれかではありません:HQLは、SQLとほぼ同じです

+0

この質問は私の質問ではごく一部です。私の実際のクエリははるかに難しいですし、私はここに書いて、私はすでにQueryOverですべてを持っている、すべてのhqlまたはlinqに移動するのは難しく問題があります。 –

+0

あまりにも悪いです。 SQLプロジェクションを使用してください。それを維持する幸運。 –

+0

「CriteriaとQueryOverが最適化されていません」とはどういう意味ですか?あなたは私のためにこれを処理するカスタムプロジェクションを書くことに何らかの問題を予見していますか? – csano

関連する問題