Nhibernateに算術操作の予測はありますか?
-
26-10-2019 - |
質問
この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>());
解決
算術演算子は、基準のクエリで使用できます。 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に文字列を直接注入するため、基礎となるデータベースが使用するオペレーターをサポートすることを確認する必要があります。
他のヒント
LINQまたはHQLでは些細なことですが、基準とクエリオーバーは最適化されていません(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)
所属していません StackOverflow