2012-09-01 16 views
5

Potrei davvero usare alcune indicazioni su come portare questa query sql su NHibernate QueryOver. I miei tentativi erano di usare Linq perché sono un po 'più familiare con Linq. Il progetto su cui stiamo lavorando utilizza QueryOver, quindi per il momento potrebbe essere meglio rimanere su quella rotta.NHibernate Come convertire questa query SQL in QueryOver o Linq

di lavoro di query SQL: Rounds DateTime a 1 minuto e gruppi/Ordinamenti/conta correttamente ...

select dateadd(minute,(datediff(minute,0,dateTimeColumn)/1)*1,0), COUNT(*) 
from PartData 
group by dateadd(minute,(datediff(minute,0,dateTimeColumn)/1)*1,0) 
order by dateadd(minute,(datediff(minute,0,dateTimeColumn)/1)*1,0) 

rendimenti attesi risultati di:

2012-08-31 00:00:00.000, 3 
2012-08-31 00:01:00.000, 4 
2012-08-31 00:02:00.000, 3 
2012-08-31 00:03:00.000, 3 
2012-08-31 00:04:00.000, 4 
2012-08-31 00:05:00.000, 3 
2012-08-31 00:06:00.000, 3 
2012-08-31 00:07:00.000, 4 
2012-08-31 00:08:00.000, 3 

EDIT

Mi sto avvicinando ...

private IQueryOver<entities.PartData, entities.PartData> PartPerHourQuery(ISession session) 
{ 
    return session.QueryOver<entities.PartData>() 
     .Select(
      Projections.Alias(
       Projections.GroupProperty(
        Projections.SqlFunction(
         new SQLFunctionTemplate(NHibernateUtil.DateTime, "DateAdd(mm,1,Date)"), 
         NHibernateUtil.DateTime, _partsDate)) 
       , "Date"), 
      Projections.Alias(Projections.RowCount(), "Count")) 
       .TransformUsing(Transformers.AliasToBean<entities.PartsPerHour>()); 
} 

rese il seguente SQL:

SELECT DateAdd(mm,1,dateTimeColumn), count(*) 
FROM [PartData] 
GROUP BY DateAdd(mm,1,dateTimeColumn) 

solo bisogno di capire come ottenere il datediff in là :)

risposta

6

Attraverso il potere della perseveranza, sono riuscito a vincere questa battaglia. Ecco il mio QueryOver per la query SQL sopra indicata ... Credo di aver trasformato un angolo in questa cosa di NHibernate :)

Qualsiasi suggerimento per migliorare o modi alternativi di riprodurre i risultati desiderati sono molto apprezzati.

private IQueryOver<entities.PartData, entities.PartData> PartPerHourQuery(ISession session) 
{ 
    return session.QueryOver<entities.PartData>() 
     .Select(
      Projections.Alias(
       Projections.GroupProperty(
        Projections.SqlFunction(
         new SQLFunctionTemplate(NHibernateUtil.DateTime, "DateAdd(minute," + 
                     new SQLFunctionTemplate(
                      NHibernateUtil.DateTime, 
                      "(DateDiff(minute, 0, Date)/1)*1") + 
                     ",0)"), 
         NHibernateUtil.DateTime, _partsDate)) 
       , "Date"), 
      Projections.Alias(Projections.RowCount(), "Count")) 
     .TransformUsing(Transformers.AliasToBean<entities.PartsPerHour>()); 
} 
+0

Wow, non mi rendevo conto che era possibile! Molto bene! – Rippo