string GetOperator(SqlBinaryExpression expression) { switch (expression.NodeType) { case SqlNodeType.BitwiseAnd: return "&"; case SqlNodeType.And: return " AND "; case SqlNodeType.BitwiseOr: return "|"; case SqlNodeType.Or: return " OR "; case SqlNodeType.LessThan: return " < "; case SqlNodeType.LessThanOrEqual: return " <= "; case SqlNodeType.GreaterThan: return " > "; case SqlNodeType.GreaterThanOrEqual: return " >= "; case SqlNodeType.Equal: return " = "; case SqlNodeType.NotEqual: return " <> "; case SqlNodeType.In: return " IN "; case SqlNodeType.Is: return " IS "; case SqlNodeType.IsNot: return " IS NOT "; default: throw new ArgumentOutOfRangeException(); } }
protected override SqlExpression Visit(SqlBinaryExpression expression) { switch (expression.NodeType) { case SqlNodeType.And: case SqlNodeType.BitwiseAnd: case SqlNodeType.Or: case SqlNodeType.BitwiseOr: return base.Visit(expression); } return expression; }
protected override SqlExpression Visit(SqlBinaryExpression expression) { if (expression.Right.NodeType == SqlNodeType.Constant && ((SqlConstantExpression) expression.Right).Value == null) { switch (expression.NodeType) { case SqlNodeType.Equal: return new SqlBinaryExpression(SqlNodeType.Is, expression.Left, new SqlConstantExpression(typeof(object), null)); case SqlNodeType.NotEqual: return new SqlBinaryExpression(SqlNodeType.IsNot, expression.Left, new SqlConstantExpression(typeof(object), null)); } } return base.Visit(expression); }
protected override SqlExpression Visit(SqlBinaryExpression expression) { sql.Append("("); switch (expression.NodeType) { case SqlNodeType.BitwiseAnd: case SqlNodeType.And: case SqlNodeType.BitwiseOr: case SqlNodeType.Or: case SqlNodeType.LessThan: case SqlNodeType.LessThanOrEqual: case SqlNodeType.GreaterThan: case SqlNodeType.GreaterThanOrEqual: case SqlNodeType.Equal: case SqlNodeType.NotEqual: case SqlNodeType.In: case SqlNodeType.Is: case SqlNodeType.IsNot: Visit(expression.Left); sql.Append(GetOperator(expression)); Visit(expression.Right); break; case SqlNodeType.LikeStartsWith: Visit(expression.Left); sql.Append(" LIKE "); Visit(expression.Right); sql.Append(" + '%'"); break; case SqlNodeType.LikeContains: Visit(expression.Left); sql.Append(" LIKE "); sql.Append("'%' + "); Visit(expression.Right); sql.Append(" + '%'"); break; default: throw new ArgumentOutOfRangeException(); } sql.Append(")"); return expression; }
protected virtual SqlExpression Visit(SqlBinaryExpression expression) { return new SqlBinaryExpression(expression.NodeType, Visit(expression.Left), Visit(expression.Right)); }