2016-09-27 32 views
1

我有一個NHibernate的標準如何通過條件投影操作NHibernate訂單?

var criteria = GetCurrentSession().CreateCriteria<T>(); 

到我by子句添加順序如下:

var orderExpressions = new List<NHibernate.Criterion.Order> 
{ 
    NHibernate.Criterion.Order.Desc(Projections.Property<DT>(x => x.OrderDate)), 
    NHibernate.Criterion.Order.Asc(Projections.Property<DT>(x => x.Type)) 
}; 

使用

foreach (var expression in orderExpressions) 
{ 
    criteria.AddOrder(expression); 
} 

現在這個工程,相當於以下SQL語句:

select * from DT 
order by order_date desc, 
type asc 

我實際上需要的是:

select * from DT 
order by DATEADD(MINUTE, DATEDIFF(MINUTE, 0, order_date), 0) desc, 
type asc 

其基本上責令根據日期,但忽略了秒。我如何將它納入上面的NHibernate標準表達式?

回答

1

有點徘徊導致我到SQLFunctionTemplate類不支持的SQL函數。

var orderExpressions = new List<NHibernate.Criterion.Order> 
{ 
    NHibernate.Criterion.Order.Desc(
     Projections.SqlFunction(
      new SQLFunctionTemplate(NHibernateUtil.DateTime, 
       "DateAdd(MINUTE, " + 
       new SQLFunctionTemplate(NHibernateUtil.DateTime, 
        "DateDiff(MINUTE, 0, ?1)" 
       ) + 
       ", 0)"), 
       NHibernateUtil.DateTime, 
       Projections.Property<DocumentTracking>(x => x.OrderDate) 
     ) 
    ), 
    NHibernate.Criterion.Order.Asc(Projections.Property<DocumentTracking>(x => x.Type)) 
}; 

其中

   new SQLFunctionTemplate(NHibernateUtil.DateTime, 
        "DateDiff(MINUTE, 0, ?1)" 
       ) 

表示DATEDIFF(MINUTE, 0, order_date)(?1表示參數將在後面給出)

  new SQLFunctionTemplate(NHibernateUtil.DateTime, 
      "DateAdd(MINUTE, " + 
      new SQLFunctionTemplate(NHibernateUtil.DateTime, 
       "DateDiff(MINUTE, 0, ?1)" 
      ) + 
      ", 0)") 

:我所需的查詢可以使用再製成代表dateadddatediff。 (這位DATEADD(MINUTE, DATEDIFF(MINUTE, 0, order_date), 0))。

該位借給爲datediff上述參數(訂購日期):

   NHibernateUtil.DateTime, 
       Projections.Property<DocumentTracking>(x => x.OrderDate)