NHibernate 将 sql 查询转换为 NHibernate QueryOver 查询
Posted
技术标签:
【中文标题】NHibernate 将 sql 查询转换为 NHibernate QueryOver 查询【英文标题】:NHibernate transform sql query to NHibernate QueryOver query 【发布时间】:2020-11-12 18:00:47 【问题描述】:所以我有一些 SQL 查询,我不确定如何转换为 NHibernate 语法
cast(case when count(distinct order) > 1 then count(distinct order) * -1 else max(order.orderId) end as int)
我目前有以下 NHibernate 代码:
projectionList.Add(
Projections.Conditional(
Restrictions.Gt(Projections.CountDistinct(() => orderDto), 1),
Projections.CountDistinct(() => orderDto), // TODO: * -1
Projections.Max(() => orderDto.orderId)
)
);
如您所见,我不确定* -1
部分该怎么做?有人知道怎么做吗?
【问题讨论】:
【参考方案1】:您可以使用SQLFunctionTemplate
和Projections.SqlFunction
来表达任何需要投影参数的复杂SQL。在您的情况下,您可以执行以下操作:
//All projections parameters in template are replaced with placeholders like ?1 ?2 ?3...
//If possible move it to static field to avoid template parsing on each execution
var yourTemplate = new SQLFunctionTemplate(
NHibernateUtil.Int32, //Template result
"cast(case when ?1 > 1 then ?1 * -1 else ?2 end as int)");
//And in you query use the following projection:
Projections.SqlFunction(
yourTemplate,
null,
Projections.CountDistinct(() => orderDto), //?1 in template
Projections.Max(() => orderDto.orderId) //?2 in template
);
【讨论】:
以上是关于NHibernate 将 sql 查询转换为 NHibernate QueryOver 查询的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate 2 + Fluent Nhibernate 中等信任