Esempio n. 1
0
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
 {
     uo.Operand = VisitExpression(uo.Operand);
     if (uo.NodeType == SqlNodeType.Convert)
     {
         IProviderType sqlType         = uo.Operand.SqlType;
         IProviderType newSqlType      = uo.SqlType;
         Type          nonNullableType = TypeSystem.GetNonNullableType(uo.Operand.ClrType);
         Type          clrType         = TypeSystem.GetNonNullableType(uo.ClrType);
         if (clrType == typeof(char))
         {
             if (nonNullableType == typeof(bool))
             {
                 throw Error.ConvertToCharFromBoolNotSupported();
             }
             if (sqlType.IsNumeric)
             {
                 return(sql.FunctionCall(uo.ClrType, "NCHAR", new[] { uo.Operand }, uo.SourceExpression));
             }
             if (!StringConversionIsSafe(sqlType, newSqlType))
             {
                 throw Error.UnsafeStringConversion(sqlType.ToQueryString(), newSqlType.ToQueryString());
             }
             if (StringConversionIsNeeded(sqlType, newSqlType))
             {
                 uo.SetSqlType(sql.TypeProvider.From(uo.ClrType, sqlType.HasSizeOrIsLarge ? sqlType.Size : null));
             }
             return(uo);
         }
         if (((nonNullableType == typeof(char)) && (sqlType.IsChar || sqlType.IsString)) && newSqlType.IsNumeric)
         {
             //return sql.FunctionCall(clrType, sql.TypeProvider.From(typeof(int)), "UNICODE", new[] { uo.Operand }, uo.SourceExpression);
             return(sql.UNICODE(clrType, uo));
         }
         if (clrType != typeof(string))
         {
             return(uo);
         }
         if (nonNullableType == typeof(double))
         {
             return(ConvertDoubleToString(uo.Operand, uo.ClrType));
         }
         if (nonNullableType == typeof(bool))
         {
             return(ConvertBitToString(uo.Operand, uo.ClrType));
         }
         if (!StringConversionIsSafe(sqlType, newSqlType))
         {
             throw Error.UnsafeStringConversion(sqlType.ToQueryString(), newSqlType.ToQueryString());
         }
         if (StringConversionIsNeeded(sqlType, newSqlType))
         {
             uo.SetSqlType(sql.TypeProvider.From(uo.ClrType, sqlType.HasSizeOrIsLarge ? sqlType.Size : null));
         }
     }
     return(uo);
 }
Esempio n. 2
0
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
 {
     base.VisitUnaryOperator(uo);
     if (((uo.NodeType != SqlNodeType.Convert) && (uo.Operand != null)) && (uo.Operand.SqlType != null))
     {
         uo.SetSqlType(typeProvider.PredictTypeForUnary(uo.NodeType, uo.Operand.SqlType));
     }
     return(uo);
 }