@@ -147,34 +147,40 @@ protected HqlTreeNode VisitExpression(Expression expression)
147
147
148
148
private HqlTreeNode VisitTypeBinaryExpression ( TypeBinaryExpression expression )
149
149
{
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 ;
151
157
if ( meta != null && ! meta . IsExplicitPolymorphism )
152
158
{
153
159
//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 ( ) ;
162
166
163
167
if ( nodes . Count == 1 )
164
168
{
165
169
return _hqlTreeBuilder . Equality (
166
- _hqlTreeBuilder . Dot ( Visit ( expression . Expression ) . AsExpression ( ) , _hqlTreeBuilder . Class ( ) ) ,
170
+ _hqlTreeBuilder . Dot ( Visit ( expression ) . AsExpression ( ) , _hqlTreeBuilder . Class ( ) ) ,
167
171
nodes [ 0 ] ) ;
168
172
}
169
- else if ( nodes . Count > 1 )
173
+
174
+ if ( nodes . Count > 1 )
170
175
{
171
176
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 ) ) ;
176
181
}
177
- else
182
+
183
+ if ( nodes . Count == 0 )
178
184
{
179
185
const string abstractClassWithNoSubclassExceptionMessageTemplate =
180
186
@"The class {0} can't be instatiated and does not have mapped subclasses;
@@ -185,9 +191,10 @@ private HqlTreeNode VisitTypeBinaryExpression(TypeBinaryExpression expression)
185
191
throw new NotSupportedException ( string . Format ( abstractClassWithNoSubclassExceptionMessageTemplate , meta . EntityName ) ) ;
186
192
}
187
193
}
194
+
188
195
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 ) ) ;
191
198
}
192
199
193
200
protected HqlTreeNode VisitNhStar ( NhStarExpression expression )
0 commit comments