internal long Compare(object vLeft, object vRight, Type type, int op) { //Debug.WriteLine("Compare '" + vLeft.ToString() + "' to '" + vRight.ToString() + "' , type " + type.ToString()); long result = 0; bool typeMismatch = false; try { if (type == typeof(UInt64)) { Decimal dec = Convert.ToDecimal(vLeft) - Convert.ToDecimal(vRight); if (dec == 0) { result = 0; } else if (dec > 0) { result = 1; } else { result = -1; } } else if (type == typeof(char)) { result = Convert.ToInt32(vLeft) - Convert.ToInt32(Convert.ToChar(vRight)); } else if (ExpressionNode.IsInteger(type)) { Int64 a = Convert.ToInt64(vLeft); Int64 b = Convert.ToInt64(vRight); checked { result = a - b; } } else if (type == typeof(Decimal)) { Decimal a = Convert.ToDecimal(vLeft); Decimal b = Convert.ToDecimal(vRight); result = Decimal.Compare(a, b); } else if (type == typeof(double)) { Double a = Convert.ToDouble(vLeft); Double b = Convert.ToDouble(vRight); double d; checked { d = a - b; } if (d == 0) { result = 0; } else if (d > 0) { result = 1; } else { result = -1; } } else if (type == typeof(Single)) { Single a = Convert.ToSingle(vLeft); Single b = Convert.ToSingle(vRight); Single d; checked { d = a - b; } if (d == 0) { result = 0; } else if (d > 0) { result = 1; } else { result = -1; } } else if (type == typeof(DateTime)) { //Debug.WriteLine("Compare '" + vLeft.ToString() + "' to '" + vRight.ToString() + "'"); result = DateTime.Compare(Convert.ToDateTime(vLeft), Convert.ToDateTime(vRight)); //Debug.WriteLine("result = " + result.ToString()); } else if (type == typeof(string)) { //Debug.WriteLine("Compare '" + vLeft.ToString() + "' to '" + vRight.ToString() + "'"); result = table.Compare(Convert.ToString(vLeft), Convert.ToString(vRight), CompareOptions.None); //Debug.WriteLine("result = " + result.ToString()); } else if (type == typeof(Guid)) { //Debug.WriteLine("Compare '" + vLeft.ToString() + "' to '" + vRight.ToString() + "'"); result = ((Guid)vLeft).CompareTo((Guid)vRight); //Debug.WriteLine("result = " + result.ToString()); } else if (type == typeof(bool)) { if (op == Operators.EqualTo || op == Operators.NotEqual) { object bLeft = DataExpression.ToBoolean(vLeft); object bRight = DataExpression.ToBoolean(vRight); result = Convert.ToInt32(bLeft) - Convert.ToInt32(bRight); } else { typeMismatch = true; } } else { typeMismatch = true; } } catch { SetTypeMismatchError(op, vLeft.GetType(), vRight.GetType()); } if (typeMismatch) { SetTypeMismatchError(op, vLeft.GetType(), vRight.GetType()); } return(result); }