private static Expression RemoveOrWithConstantBool(BinaryExpression node) { var constant = ExpressionParser.SingleOrDefault <ConstantExpression>(node.Left, node.Right); if (constant != null) { if (constant.Type == typeof(bool)) { var value = (bool)constant.Value; var notConstant = constant == node.Left ? node.Right : node.Left; if (value) { throw new Exception("cannot || with true"); } else { return(notConstant); } } } return(node); }
private static Expression RewriteEqualWithConstantBool(BinaryExpression node) { if (node.Left.NodeType == ExpressionType.Constant && node.Right.NodeType == ExpressionType.Constant) { return(node); } var constant = ExpressionParser.SingleOrDefault <ConstantExpression>(node.Left, node.Right); if (constant != null) { if (constant.Type == typeof(bool)) { var value = (bool)constant.Value; var notConstant = constant == node.Left ? node.Right : node.Left; if (value == false) { return(Expression.Not(notConstant)); } else { return(notConstant); } } } return(node); }
public static RangeDefinition Parse(BinaryExpression node) { var field = ExpressionParser.SingleOrDefault <MemberExpression>(node.Left, node.Right); var value = ExpressionParser.ParseNodes <object>(ExpressionType.Constant, ExpressionParser.ParseConstant <object>, node.Left, node.Right); var criteria = new RangeCriteria(); if (object.ReferenceEquals(node.Left, field) == true) { switch (node.NodeType) { case ExpressionType.GreaterThan: criteria.Greater = value; break; case ExpressionType.GreaterThanOrEqual: criteria.GreaterOrEqual = value; break; case ExpressionType.LessThan: criteria.Smaller = value; break; case ExpressionType.LessThanOrEqual: criteria.SmallerOrEqual = value; break; default: throw new Exception("invalid range operator"); } } else { switch (node.NodeType) { case ExpressionType.GreaterThan: criteria.Smaller = value; break; case ExpressionType.GreaterThanOrEqual: criteria.SmallerOrEqual = value; break; case ExpressionType.LessThan: criteria.Greater = value; break; case ExpressionType.LessThanOrEqual: criteria.GreaterOrEqual = value; break; default: throw new Exception("invalid range operator"); } } return(new RangeDefinition { Field = ExpressionParser.ParseMember(field), Criteria = criteria, }); }