Проекции. Условно - как это использовать? - PullRequest
7 голосов
/ 03 августа 2009

Кто-нибудь знает, как использовать Projection.Conditional для создания чего-то вроде «case ... when ...»

Следующий код дает неправильный запрос:

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" )
  );

Произведенное утверждение является неполным, и порядок параметров неправильный.

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' 

Как правильно использовать Projection.Conditional?

1 Ответ

2 голосов
/ 05 августа 2009

ОБНОВЛЕНИЕ: проблема (NH1911) теперь помечена как исправленная в версии 2.1.1.GA. Попробуйте проверить это!


Кажется, что используются именованные и позиционные параметры вместе. Похоже, это ошибка, как вы, наверное, тоже сделали вывод:

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

Projection.Constant использует позиционные, а Restriction.Eq использует именованные параметры. Это портит порядок, описанный здесь, хотя эта проблема должна быть исправлена:

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

...