2011-01-28 11 views
6

Bu SQL'i NHibernate'den almak istiyorum:NHibernate'de herhangi bir aritmetik işlem projeksiyonu var mı?

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

Fakat herhangi bir aritmetik işlem (*) projeksiyonu bulamıyorum.

Şimdiye kadar sahip olduğum kod:

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 ile yapabilecek olsanız bile, hql sorgusu çok daha okunabilir olacaktır. Bu sorgudaki – Sly

cevap

8

Aritmetik işleçler, VarArgsSQLFunction SQL işleviyle ölçüt sorgularında kullanılabilir. belirli bir durumda, böyle bir şey görünecektir: Bu teknik, doğrudan üretilen SQL dizeleri enjekte

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

, bu nedenle temel veritabanı kullandığınız operatörlerini destekler emin olmak gerekir.

+0

Bu çözümün% 100 iyi olup olmadığını kontrol etmenin hızlı bir yolu yok, ancak VarArgsSQLFunction sınıf belgelerine bakarak, yıllar önce aradığım şey olduğundan eminim :) Bu cevabı umarım Gelecekte başkalarına yardım edecek. –

2

Bu LINQ veya HQL ile önemsiz, ama Kriterleri ve QueryOver (bir SQL projeksiyonu kullanmak zorunda)

bunun için optimize edilmemiş:

Bu

var bugüne kadar olduğu kodudur

:

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

LINQ zor ya değildir: HQL SQL hemen hemen aynıdır

+0

bu sorgu sadece küçük bir parçasıdır. Benim gerçek sorgum çok daha zor o zaman ben burada yazdım, ve QueryOver ile hepsini aldım, hql veya linq için tüm hareket zor ve sorunlu olurdu. –

+0

Çok yazık. Sonra bir SQL projeksiyonu kullanın. Bunu sürdürmek için iyi şanslar. –

+0

"Ölçüt ve Sorgulama bunun için optimize edilmiyor" ile ne kastediyorsunuz? Bunu benim için halledecek özel bir projeksiyon yazarak herhangi bir sorun öngörüyor musunuz? – csano

İlgili konular