@@ -147,34 +147,40 @@ protected HqlTreeNode VisitExpression(Expression expression)
147147
148148 private HqlTreeNode VisitTypeBinaryExpression ( TypeBinaryExpression expression )
149149 {
150- var meta = SessionFactory . GetClassMetadata ( expression . TypeOperand ) as Persister . Entity . AbstractEntityPersister ;
150+ return BuildOfType ( expression . Expression , expression . TypeOperand ) ;
151+ }
152+
153+ internal HqlBooleanExpression BuildOfType ( Expression expression , System . Type type )
154+ {
155+ var sessionFactory = _parameters . SessionFactory ;
156+ var meta = sessionFactory . GetClassMetadata ( type ) as Persister . Entity . AbstractEntityPersister ;
151157 if ( meta != null && ! meta . IsExplicitPolymorphism )
152158 {
153159 //Adapted the logic found in SingleTableEntityPersister.DiscriminatorFilterFragment
154- var Factory = SessionFactory as NHibernate . Engine . ISessionFactoryImplementor ;
155- var nodes = new System . Collections . Generic . List < HqlIdent > ( ) ;
156- foreach ( var typeName in meta . SubclassClosure )
157- {
158- var persister = ( NHibernate . Persister . Entity . IQueryable ) Factory . GetEntityPersister ( typeName ) ;
159- if ( persister . IsAbstract ) continue ;
160- nodes . Add ( _hqlTreeBuilder . Ident ( persister . EntityName ) ) ;
161- }
160+ var nodes = meta
161+ . SubclassClosure
162+ . Select ( typeName => ( NHibernate . Persister . Entity . IQueryable ) sessionFactory . GetEntityPersister ( typeName ) )
163+ . Where ( persister => ! persister . IsAbstract )
164+ . Select ( persister => _hqlTreeBuilder . Ident ( persister . EntityName ) )
165+ . ToList ( ) ;
162166
163167 if ( nodes . Count == 1 )
164168 {
165169 return _hqlTreeBuilder . Equality (
166- _hqlTreeBuilder . Dot ( Visit ( expression . Expression ) . AsExpression ( ) , _hqlTreeBuilder . Class ( ) ) ,
170+ _hqlTreeBuilder . Dot ( Visit ( expression ) . AsExpression ( ) , _hqlTreeBuilder . Class ( ) ) ,
167171 nodes [ 0 ] ) ;
168172 }
169- else if ( nodes . Count > 1 )
173+
174+ if ( nodes . Count > 1 )
170175 {
171176 return _hqlTreeBuilder . In (
172- _hqlTreeBuilder . Dot (
173- Visit ( expression . Expression ) . AsExpression ( ) ,
174- _hqlTreeBuilder . Class ( ) ) ,
175- _hqlTreeBuilder . ExpressionSubTreeHolder ( nodes . ToArray ( ) ) ) ;
177+ _hqlTreeBuilder . Dot (
178+ Visit ( expression ) . AsExpression ( ) ,
179+ _hqlTreeBuilder . Class ( ) ) ,
180+ _hqlTreeBuilder . ExpressionSubTreeHolder ( nodes ) ) ;
176181 }
177- else
182+
183+ if ( nodes . Count == 0 )
178184 {
179185 const string abstractClassWithNoSubclassExceptionMessageTemplate =
180186@"The class {0} can't be instatiated and does not have mapped subclasses;
@@ -185,9 +191,10 @@ private HqlTreeNode VisitTypeBinaryExpression(TypeBinaryExpression expression)
185191 throw new NotSupportedException ( string . Format ( abstractClassWithNoSubclassExceptionMessageTemplate , meta . EntityName ) ) ;
186192 }
187193 }
194+
188195 return _hqlTreeBuilder . Equality (
189- _hqlTreeBuilder . Dot ( Visit ( expression . Expression ) . AsExpression ( ) , _hqlTreeBuilder . Class ( ) ) ,
190- _hqlTreeBuilder . Ident ( expression . TypeOperand . FullName ) ) ;
196+ _hqlTreeBuilder . Dot ( Visit ( expression ) . AsExpression ( ) , _hqlTreeBuilder . Class ( ) ) ,
197+ _hqlTreeBuilder . Ident ( type . FullName ) ) ;
191198 }
192199
193200 protected HqlTreeNode VisitNhStar ( NhStarExpression expression )
0 commit comments