protected override Expression VisitBinaryExpression(BinaryExpression expression) { var currentlyInBooleanExpression = _inBooleanExpression; var ret = new BooleanFlagExpression(false); switch (expression.NodeType) { case ExpressionType.Equal: case ExpressionType.NotEqual: _inBooleanExpression = false; ret = new BooleanFlagExpression( ( // Allowed: x.prop=constant (expression.Left is MemberExpression && expression.Right is ConstantExpression) || // Allowed: x.prop=y.other_prop (expression.Left is MemberExpression && expression.Right is MemberExpression) ) && // Check left and right expression content are optimisable IsTrue(VisitExpression(expression.Left)) && IsTrue(VisitExpression(expression.Right))); break; case ExpressionType.OrElse: case ExpressionType.AndAlso: _inBooleanExpression = true; ret = new BooleanFlagExpression( // Check left and right expression content are optimisable IsTrue(VisitExpression(expression.Left)) && IsTrue(VisitExpression(expression.Right))); break; } _inBooleanExpression = currentlyInBooleanExpression; return ret; }
protected override Expression VisitBinaryExpression(BinaryExpression expression) { var currentlyInBooleanExpression = _inBooleanExpression; var ret = new BooleanFlagExpression(false); switch (expression.NodeType) { case ExpressionType.Equal: case ExpressionType.NotEqual: _inBooleanExpression = false; ret = new BooleanFlagExpression( ( // Allowed: x.prop=constant (expression.Left is MemberExpression && expression.Right is ConstantExpression) || // Allowed: x.prop=y.other_prop (expression.Left is MemberExpression && expression.Right is MemberExpression) ) && // Check left and right expression content are optimisable IsTrue(VisitExpression(expression.Left)) && IsTrue(VisitExpression(expression.Right))); break; case ExpressionType.OrElse: case ExpressionType.AndAlso: _inBooleanExpression = true; ret = new BooleanFlagExpression( // Check left and right expression content are optimisable IsTrue(VisitExpression(expression.Left)) && IsTrue(VisitExpression(expression.Right))); break; } _inBooleanExpression = currentlyInBooleanExpression; return(ret); }