protected override Expression VisitSqlBinary(SqlBinaryExpression sqlBinaryExpression) { var op = _operatorMap[sqlBinaryExpression.OperatorType]; _sqlBuilder.Append("("); Visit(sqlBinaryExpression.Left); if (sqlBinaryExpression.OperatorType == ExpressionType.Add && sqlBinaryExpression.Left.Type == typeof(string)) { op = " || "; } _sqlBuilder.Append(op); Visit(sqlBinaryExpression.Right); _sqlBuilder.Append(")"); return(sqlBinaryExpression); }
public void ApplyPredicate(SqlExpression expression) { if (expression is SqlConstantExpression sqlConstant && (bool)sqlConstant.Value) { return; } if (Predicate == null) { Predicate = expression; } else { Predicate = new SqlBinaryExpression( ExpressionType.AndAlso, Predicate, expression, typeof(bool), expression.TypeMapping); } }
protected abstract Expression VisitSqlBinary(SqlBinaryExpression sqlBinaryExpression);
private SqlExpression ApplyTypeMappingOnSqlBinary( SqlBinaryExpression sqlBinaryExpression, CoreTypeMapping typeMapping) { var left = sqlBinaryExpression.Left; var right = sqlBinaryExpression.Right; Type resultType; CoreTypeMapping resultTypeMapping; CoreTypeMapping inferredTypeMapping; switch (sqlBinaryExpression.OperatorType) { case ExpressionType.Equal: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: case ExpressionType.NotEqual: { inferredTypeMapping = ExpressionExtensions.InferTypeMapping(left, right) ?? _typeMappingSource.FindMapping(left.Type); resultType = typeof(bool); resultTypeMapping = _boolTypeMapping; } break; case ExpressionType.AndAlso: case ExpressionType.OrElse: { inferredTypeMapping = _boolTypeMapping; resultType = typeof(bool); resultTypeMapping = _boolTypeMapping; } break; case ExpressionType.Add: case ExpressionType.Subtract: case ExpressionType.Multiply: case ExpressionType.Divide: case ExpressionType.Modulo: case ExpressionType.LeftShift: case ExpressionType.RightShift: case ExpressionType.Coalesce: case ExpressionType.And: case ExpressionType.Or: { inferredTypeMapping = typeMapping ?? ExpressionExtensions.InferTypeMapping(left, right); resultType = left.Type; resultTypeMapping = inferredTypeMapping; } break; default: throw new InvalidOperationException("Incorrect operatorType for SqlBinaryExpression"); } return(new SqlBinaryExpression( sqlBinaryExpression.OperatorType, ApplyTypeMapping(left, inferredTypeMapping), ApplyTypeMapping(right, inferredTypeMapping), resultType, resultTypeMapping)); }