2011-07-29 1 views
3

は、私は私の方言サブクラスでSQL関数を登録しているので、NHibernateのQueryOver構文でSqlFunctionのMAX()を選択できますか?

var q = _session.QueryOver<Event>() 
    .Select(
     Projections.SqlFunction(
      "addseconds", 
      NHibernateUtil.Date, 
      Projections.Property<Event>(x => x.DurationInSeconds), 
      Projections.Property<Event>(x => x.StartTime))); 

SQLを生成するようにクエリで使用することができます

RegisterFunction("addseconds", new SQLFunctionTemplate(NHibernateUtil.Date, "dateadd(second, ?1, ?2)")); 

SELECT dateadd(second, 
       this_.DurationInSeconds, 
       this_.StartTime) as y0_ 
FROM [Event] this_ 

が、私は本当によ何後は

SELECT MAX(dateadd(second, 
       this_.DurationInSeconds, 
       this_.StartTime)) as y0_ 
FROM [Event] this_ 

残念ながら、私はProjections.SqlFunctionを取るためにSelectMaxを得ることができません。それはできますか?

答えて

7

あなたはDateTimeのようにNHUtilを更新する必要があります。

RegisterFunction("addseconds", new SQLFunctionTemplate(NHibernateUtil.DateTime, "dateadd(second, ?1, ?2)")); 

そうでなければあなただけの日付部分に対処されます。

あなたのクエリは結構です、あなただけのProjections.Max(でそれをラップする必要がある)ので、のように:

var q = _session.QueryOver<Event>() 
       .Select(Projections.Max(Projections.SqlFunction(
         "addseconds", 
         NHibernateUtil.DateTime, 
         Projections.Property<Event>(y => y.DurationInSeconds), 
         Projections.Property<Event>(y => y.StartTime)))) 
       .SingleOrDefault<DateTime>(); 

私はすぐにテスト、(上記とは異なる命名)を書いて、それは、クエリを作成:

SELECT max(dateadd(second, 
        this_.DurationInSeconds, 
        this_.SomeDate)) as y0_ 
FROM Employee this_ 
関連する問題