任何人都知道如何使用Projections.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'
使用Projections.Conditional的正确方法是什么?
答案 0 :(得分:2)
更新:问题(NH1911)现在在版本2.1.1.GA中标记为已修复。尝试检查一下!
似乎是将命名和位置参数一起使用。它似乎确实是一个错误,因为你必须得出结论:
https://nhibernate.jira.com/browse/NH-1911
Projections.Constant使用位置,Restriction.Eq使用命名参数。这会扰乱这里所描述的秩序,尽管这个问题应该已经解决了:
https://forum.hibernate.org/viewtopic.php?f=25&t=985944&start=0