Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Projections.Conditional - How to use it?

Anyone knows how to use Projections.Conditional to produce something like "case ... when..."

The following code gives a wrong query:

IProjection isError = Projections.Conditional( Expression.Eq( "event.LogLevel", eLogLevel.Fatal.ToString( ) ), Projections.Constant( 1 ), Projections.Constant( 0 ) );

ICriteria criteria = Session.CreateCriteria( typeof( LogEvent ), "event" )
  .Add( Restrictions.Eq( "event.ApplID", "LogEventViewer" ) )
  .SetProjection( Projections.ProjectionList( )
    .Add( Projections.GroupProperty( "event.ApplID" ) )
    .Add( Projections.RowCount( ), "TotalCount" )
    .Add( Projections.Sum( isError ), "ErrorCount" )
  );

The produced statement is incomplete and the order of the parameters is wrong.

exec sp_executesql N'
  SELECT this_.strApplID as y0_
    , count(distinct this_.lngLogEventID) as y1_ 
    , sum((case when this_.strLogLevel = ? then ? else ? end)) as y2_
    , this_.strApplID as y3_ 
  FROM qryLogEvent this_ 
  WHERE this_.strApplID = @p0 
  GROUP BY this_.strApplID' 
,N'@p0 nvarchar(5),@p1 int,@p2 int,@p3 nvarchar(14)'
,@p0=N'Fatal',@p1=1,@p2=0,@p3=N'LogEventViewer' 

what is the correct way to use Projections.Conditional?

like image 626
Caro Avatar asked Aug 03 '09 14:08

Caro


1 Answers

UPDATE: The issue (NH1911) is now marked as fixed in version 2.1.1.GA. Try checking that one out!


It seems to be the use of named and positional parameters together. It does seem to be a bug, as you must have concluded too:

https://nhibernate.jira.com/browse/NH-1911

Projections.Constant uses positional and the Restriction.Eq uses named parameters. That messes up the order as desribed here, though this issue should have been fixed:

https://forum.hibernate.org/viewtopic.php?f=25&t=985944&start=0

like image 109
asgerhallas Avatar answered Sep 20 '22 11:09

asgerhallas