2012-09-01 10 views
5

このSQLクエリをNHibernate QueryOverにどのように取るかに関するガイダンスを実際に使用することができます。私はLinqをもう少し詳しく知っていたので、Linqを使用しようとしました。私たちが取り組んでいるプロジェクトはQueryOverを使用しているので、今のところそのルートを維持することが最善の方法かもしれません。NHibernateこのSQLクエリをQueryOverまたはLinqに変換する方法

ワーキングSQLクエリ:... 1分、適切にグループ/種類/数に期待

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) 

戻り値のDateTimeを四捨五入した結果:

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

近づいています...

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

には、以下のSQLを生成:

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

ちょうどそこにDateDiff関数を取得する方法を見つけ出す必要がある:)

答えて

6

パシビアランスの力によって、私はこの戦いに勝つために管理。ここに私のQueryOverは、上記のSQLクエリです...私はこのNHibernateものの角を回していると信じて:)

意図した結果を再生成するための任意の提案は非常に認めています。

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

わかりませんでした!よくやった! – Rippo