2016-09-27 35 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)