@@ -252,6 +252,26 @@ private static ICriterion Le(ProjectionInfo property, object value)
252252 /// </summary>
253253 public static object FindValue ( Expression expression )
254254 {
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+
255275 var valueExpression = Expression . Lambda ( expression ) . Compile ( ) ;
256276 object value = valueExpression . DynamicInvoke ( ) ;
257277 return value ;
@@ -452,16 +472,12 @@ public static DetachedCriteria FindDetachedCriteria(Expression expression)
452472 if ( methodCallExpression == null )
453473 throw new ArgumentException ( "right operand should be detachedQueryInstance.As<T>() - " + expression , nameof ( expression ) ) ;
454474
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 ;
458476 }
459477
460478 private static bool EvaluatesToNull ( Expression expression )
461479 {
462- var valueExpression = Expression . Lambda ( expression ) . Compile ( ) ;
463- object value = valueExpression . DynamicInvoke ( ) ;
464- return ( value == null ) ;
480+ return FindValue ( expression ) == null ;
465481 }
466482
467483 private static System . Type FindMemberType ( Expression expression )
0 commit comments