Mercurial > pub > bltoolkit
diff Source/Data/Sql/SqlValue.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Data/Sql/SqlValue.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BLToolkit.Data.Sql +{ + public class SqlValue : SqlValueBase, ISqlExpression + { + public SqlValue(Type systemType, object value) + { + _systemType = systemType; + _value = value; + } + + public SqlValue(object value) + { + _value = value; + + if (value != null) + _systemType = value.GetType(); + } + + public override object Value + { + get + { + var rv = base.Value; + + if (rv != null && rv.GetType() != _systemType) + { + _systemType = rv.GetType(); + } + + return rv; + } + } + + Type _systemType; public Type SystemType { get { return _systemType; } } + + #region Overrides + +#if OVERRIDETOSTRING + + public override string ToString() + { + return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString(); + } + +#endif + + #endregion + + #region ISqlExpression Members + + public int Precedence + { + get { return Sql.Precedence.Primary; } + } + + #endregion + + #region ISqlExpressionWalkable Members + + ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func) + { + return func(this); + } + + #endregion + + #region IEquatable<ISqlExpression> Members + + bool IEquatable<ISqlExpression>.Equals(ISqlExpression other) + { + if (this == other) + return true; + + var value = other as SqlValue; + return + value != null && + _systemType == value._systemType && + (_value == null && value._value == null || _value != null && _value.Equals(value._value)); + } + + #endregion + + #region ISqlExpression Members + + public bool CanBeNull() + { + return Value == null; + } + + public bool Equals(ISqlExpression other, Func<ISqlExpression, ISqlExpression, bool> comparer) + { + return ((ISqlExpression)this).Equals(other) && comparer(this, other); + } + + #endregion + + #region ICloneableElement Members + + public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone) + { + if (!doClone(this)) + return this; + + ICloneableElement clone; + + if (!objectTree.TryGetValue(this, out clone)) + objectTree.Add(this, clone = new SqlValue(_systemType, _value)); + + return clone; + } + + #endregion + + #region IQueryElement Members + + public QueryElementType ElementType { get { return QueryElementType.SqlValue; } } + + StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic) + { + return + Value == null ? + sb.Append("NULL") : + Value is string ? + sb + .Append('\'') + .Append(Value.ToString().Replace("\'", "''")) + .Append('\'') + : + sb.Append(Value); + } + + #endregion + } +}