private Predicate ImplementEqualityConstantAndUnknown(ConstantPredicate constant, Predicate unknown, EqualsPattern pattern)
        {
            switch (pattern)
            {
            case EqualsPattern.Store:
            case EqualsPattern.PositiveNullEqualityNonComposable:     // for Joins
                return(constant.Equal(unknown));

            case EqualsPattern.PositiveNullEqualityComposable:
                return(constant.Equal(unknown).And(unknown.IsNull().Not()));

            default:
                return(null);
            }
        }
Beispiel #2
0
        private ISqlFragment VisitConstant(ConstantPredicate e, bool isCastOptional)
        {
            var result = new SqlBuilder();

            var resultType = e.ResultType;

            if (resultType.IsPrimitiveType())
            {
                var typeKind = resultType.GetPrimitiveTypeKind();
                switch (typeKind)
                {
                case PrimitiveTypeKind.Int32:
                    result.Append(e.Value.ToString());
                    break;

                case PrimitiveTypeKind.Binary:
                    result.Append(" 0x");
                    result.Append(ByteArrayToBinaryString((Byte[])e.Value));
                    result.Append(" ");
                    break;

                case PrimitiveTypeKind.Boolean:
                    WrapWithCastIfNeeded(!isCastOptional, (bool)e.Value ? "1" : "0", "bit", result);
                    break;

                case PrimitiveTypeKind.Byte:
                    WrapWithCastIfNeeded(!isCastOptional, e.Value.ToString(), "tinyint", result);
                    break;

                case PrimitiveTypeKind.DateTime:
                    result.Append("convert(");
                    result.Append(IsPreKatmai ? "datetime" : "datetime2");
                    result.Append(", ");
                    result.Append(EscapeSingleQuote(((DateTime)e.Value).ToString(IsPreKatmai ? "yyyy-MM-dd HH:mm:ss.fff" : "yyyy-MM-dd HH:mm:ss.fffffff", CultureInfo.InvariantCulture), false));
                    result.Append(", 121)");
                    break;

                case PrimitiveTypeKind.Time:
                    result.Append("convert(");
                    result.Append(e.ResultType.EdmType.Name);
                    result.Append(", ");
                    result.Append(EscapeSingleQuote(e.Value.ToString(), false /* IsUnicode */));
                    result.Append(", 121)");
                    break;

                case PrimitiveTypeKind.DateTimeOffset:
                    result.Append("convert(");
                    result.Append(e.ResultType.EdmType.Name);
                    result.Append(", ");
                    result.Append(EscapeSingleQuote(((DateTimeOffset)e.Value).ToString("yyyy-MM-dd HH:mm:ss.fffffff zzz", CultureInfo.InvariantCulture), false));
                    result.Append(", 121)");
                    break;

                case PrimitiveTypeKind.Decimal:
                    var strDecimal = ((Decimal)e.Value).ToString(CultureInfo.InvariantCulture);
                    var needsCast  = -1 == strDecimal.IndexOf('.') && (strDecimal.TrimStart(new[] { '-' }).Length < 20);

                    var precision = Math.Max((Byte)strDecimal.Length, DefaultDecimalPrecision);

                    var decimalType = "decimal(" + precision.ToString(CultureInfo.InvariantCulture) + ")";

                    WrapWithCastIfNeeded(needsCast, strDecimal, decimalType, result);
                    break;

                case PrimitiveTypeKind.Double:
                {
                    var doubleValue = (Double)e.Value;
                    AssertValidDouble(doubleValue);
                    WrapWithCastIfNeeded(true, doubleValue.ToString("R", CultureInfo.InvariantCulture), "float(53)", result);
                }
                break;

                case PrimitiveTypeKind.Guid:
                    WrapWithCastIfNeeded(true, EscapeSingleQuote(e.Value.ToString(), false /* IsUnicode */), "uniqueidentifier", result);
                    break;

                case PrimitiveTypeKind.Int16:
                    WrapWithCastIfNeeded(!isCastOptional, e.Value.ToString(), "smallint", result);
                    break;

                case PrimitiveTypeKind.Int64:
                    WrapWithCastIfNeeded(!isCastOptional, e.Value.ToString(), "bigint", result);
                    break;

                case PrimitiveTypeKind.Single:
                {
                    var singleValue = (float)e.Value;
                    AssertValidSingle(singleValue);
                    WrapWithCastIfNeeded(true, singleValue.ToString("R", CultureInfo.InvariantCulture), "real", result);
                }
                break;

                case PrimitiveTypeKind.String:
                    bool isUnicode;

                    if (!e.ResultType.TryGetIsUnicode(out isUnicode))
                    {
                        isUnicode = !_forceNonUnicode;
                    }
                    result.Append(EscapeSingleQuote(e.Value as string, isUnicode));
                    break;

                default:
                    throw new NotSupportedException();
                }
            }
            else
            {
                throw new NotSupportedException();
            }

            return(result);
        }
Beispiel #3
0
        public override ISqlFragment Visit(ConstantPredicate e)
        {
            Check.NotNull(e, "e");

            return(VisitConstant(e, false /* isCastOptional */));
        }