Skip to content

Commit c3ac6a0

Browse files
authored
Avoid lambda compilation for constant and member access expressions in Criteria (#2448)
1 parent 3b5951b commit c3ac6a0

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

src/NHibernate/Impl/ExpressionProcessor.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)