繁体   English   中英

如何通过标准投影操作 NHibernate 订单?

[英]How do I manipulate an NHibernate order by criteria projection?

我有一个 NHibernate 标准

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

我在其中添加了以下 order 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 标准表达式中?

一些搜索使我找到了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)")

datediff表示dateadd (此位DATEADD(MINUTE, DATEDIFF(MINUTE, 0, order_date), 0) )。

该位为上面的datediff提供参数 (orderdate):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM