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); } }
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); }
public override ISqlFragment Visit(ConstantPredicate e) { Check.NotNull(e, "e"); return(VisitConstant(e, false /* isCastOptional */)); }