Reputation: 2214
So I have a bit of a SQL query which I am not sure how to convert to NHibernate syntax
cast(case when count(distinct order) > 1 then count(distinct order) * -1 else max(order.orderId) end as int)
I currently have the following NHibernate code:
projectionList.Add(
Projections.Conditional(
Restrictions.Gt(Projections.CountDistinct(() => orderDto), 1),
Projections.CountDistinct(() => orderDto), // TODO: * -1
Projections.Max(() => orderDto.orderId)
)
);
As you can see, I am not sure how to do the * -1
part? Has somebody any idea how to do it?
Upvotes: 0
Views: 277
Reputation: 2357
You can use SQLFunctionTemplate
and Projections.SqlFunction
to express any complex SQL that needs projection parameters. In your case you can do something like this:
//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
);
Upvotes: 1