2012-09-01 7 views
5

Ich könnte wirklich einige Hinweise dazu verwenden, wie diese SQL-Abfrage zu NHibernate QueryOver zu nehmen. Meine Versuche waren, Linq zu verwenden, da ich mit Linq etwas vertrauter bin. Das Projekt, an dem wir arbeiten, verwendet QueryOver, daher ist es am besten, diese Route vorerst beizubehalten.NHibernate Wie konvertiert man diese SQL-Abfrage zu QueryOver oder Linq

Arbeits SQL Query: richtig Runden Datetime auf 1 Minute und Gruppen/Sorten/Zählungen ...

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) 

Returns erwarteten Ergebnisse:

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

Ich komme näher ...

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

ergibt die folgende SQL:

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

brauchen nur um herauszufinden, wie die datediff da rein :)

Antwort

6

Durch die Kraft der perserverance, ich schaffte es, diesen Kampf zu gewinnen. Hier ist mein QueryOver für die oben angegebene SQL-Abfrage ... Ich glaube, ich habe eine Ecke in dieser NHibernate Sache :)

Alle Vorschläge zur Verbesserung oder alternative Möglichkeiten, die beabsichtigten Ergebnisse zu reproduzieren, werden sehr geschätzt.

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, ich wusste nicht, dass das möglich war! Gut gemacht! – Rippo