[英]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.