@@ -252,6 +252,26 @@ private static ICriterion Le(ProjectionInfo property, object value)
252
252
/// </summary>
253
253
public static object FindValue ( Expression expression )
254
254
{
255
+ if ( expression . NodeType == ExpressionType . Constant )
256
+ return ( ( ConstantExpression ) expression ) . Value ;
257
+
258
+ if ( expression . NodeType == ExpressionType . MemberAccess )
259
+ {
260
+ var memberAccess = ( MemberExpression ) expression ;
261
+ if ( memberAccess . Expression == null || memberAccess . Expression . NodeType == ExpressionType . Constant )
262
+ {
263
+ var constantValue = ( ( ConstantExpression ) memberAccess . Expression ) ? . Value ;
264
+ var member = memberAccess . Member ;
265
+ switch ( member . MemberType )
266
+ {
267
+ case MemberTypes . Field :
268
+ return ( ( FieldInfo ) member ) . GetValue ( constantValue ) ;
269
+ case MemberTypes . Property :
270
+ return ( ( PropertyInfo ) member ) . GetValue ( constantValue ) ;
271
+ }
272
+ }
273
+ }
274
+
255
275
var valueExpression = Expression . Lambda ( expression ) . Compile ( ) ;
256
276
object value = valueExpression . DynamicInvoke ( ) ;
257
277
return value ;
@@ -452,16 +472,12 @@ public static DetachedCriteria FindDetachedCriteria(Expression expression)
452
472
if ( methodCallExpression == null )
453
473
throw new ArgumentException ( "right operand should be detachedQueryInstance.As<T>() - " + expression , nameof ( expression ) ) ;
454
474
455
- var criteriaExpression = Expression . Lambda ( methodCallExpression . Object ) . Compile ( ) ;
456
- QueryOver detachedQuery = ( QueryOver ) criteriaExpression . DynamicInvoke ( ) ;
457
- return detachedQuery . DetachedCriteria ;
475
+ return ( ( QueryOver ) FindValue ( methodCallExpression . Object ) ) . DetachedCriteria ;
458
476
}
459
477
460
478
private static bool EvaluatesToNull ( Expression expression )
461
479
{
462
- var valueExpression = Expression . Lambda ( expression ) . Compile ( ) ;
463
- object value = valueExpression . DynamicInvoke ( ) ;
464
- return ( value == null ) ;
480
+ return FindValue ( expression ) == null ;
465
481
}
466
482
467
483
private static System . Type FindMemberType ( Expression expression )
0 commit comments