private static bool TryMatchCoalescePattern(Expression expression, out Expression normalized) { normalized = (Expression)null; bool flag = false; if (expression.NodeType == ExpressionType.Quote) { if (LinqExpressionNormalizer.TryMatchCoalescePattern(((UnaryExpression)expression).Operand, out normalized)) { flag = true; normalized = (Expression)Expression.Quote(normalized); } } else if (expression.NodeType == ExpressionType.Lambda) { LambdaExpression lambdaExpression = (LambdaExpression)expression; if (lambdaExpression.Body.NodeType == ExpressionType.Coalesce && lambdaExpression.Body.Type == typeof(bool)) { BinaryExpression body = (BinaryExpression)lambdaExpression.Body; if (body.Right.NodeType == ExpressionType.Constant && false.Equals(((ConstantExpression)body.Right).Value)) { normalized = (Expression)Expression.Lambda(lambdaExpression.Type, (Expression)Expression.Convert(body.Left, typeof(bool)), (IEnumerable <ParameterExpression>)lambdaExpression.Parameters); flag = true; } } } return(flag); }
private static MethodCallExpression NormalizePredicateArgument( MethodCallExpression callExpression) { int argumentOrdinal; Expression normalized; MethodCallExpression methodCallExpression; if (LinqExpressionNormalizer.HasPredicateArgument(callExpression, out argumentOrdinal) && LinqExpressionNormalizer.TryMatchCoalescePattern(callExpression.Arguments[argumentOrdinal], out normalized)) { methodCallExpression = Expression.Call(callExpression.Object, callExpression.Method, (IEnumerable <Expression>) new List <Expression>((IEnumerable <Expression>)callExpression.Arguments) { [argumentOrdinal] = normalized }); } else { methodCallExpression = callExpression; } return(methodCallExpression); }