internal int BinaryCompare(object vLeft, object vRight, StorageType resultType, int op, CompareInfo comparer)
{
int result = 0;
try
{
if (!DataStorage.IsSqlType(resultType))
{
switch (resultType)
{
case StorageType.SByte:
case StorageType.Int16:
case StorageType.Int32:
case StorageType.Byte:
case StorageType.UInt16:
return Convert.ToInt32(vLeft, FormatProvider).CompareTo(Convert.ToInt32(vRight, FormatProvider));
case StorageType.Int64:
case StorageType.UInt32:
case StorageType.UInt64:
case StorageType.Decimal:
return decimal.Compare(Convert.ToDecimal(vLeft, FormatProvider), Convert.ToDecimal(vRight, FormatProvider));
case StorageType.Char:
return Convert.ToInt32(vLeft, FormatProvider).CompareTo(Convert.ToInt32(vRight, FormatProvider));
case StorageType.Double:
return Convert.ToDouble(vLeft, FormatProvider).CompareTo(Convert.ToDouble(vRight, FormatProvider));
case StorageType.Single:
return Convert.ToSingle(vLeft, FormatProvider).CompareTo(Convert.ToSingle(vRight, FormatProvider));
case StorageType.DateTime:
return DateTime.Compare(Convert.ToDateTime(vLeft, FormatProvider), Convert.ToDateTime(vRight, FormatProvider));
case StorageType.DateTimeOffset:
// DTO can only be compared to DTO, other cases: cast Exception
return DateTimeOffset.Compare((DateTimeOffset)vLeft, (DateTimeOffset)vRight);
case StorageType.String:
return table.Compare(Convert.ToString(vLeft, FormatProvider), Convert.ToString(vRight, FormatProvider), comparer);
case StorageType.Guid:
return ((Guid)vLeft).CompareTo((Guid)vRight);
case StorageType.Boolean:
if (op == Operators.EqualTo || op == Operators.NotEqual)
{
return Convert.ToInt32(DataExpression.ToBoolean(vLeft), FormatProvider) -
Convert.ToInt32(DataExpression.ToBoolean(vRight), FormatProvider);
}
break;
}
}
else
{
switch (resultType)
{
case StorageType.SByte:
case StorageType.Int16:
case StorageType.Int32:
case StorageType.Byte:
case StorageType.UInt16:
case StorageType.SqlByte:
case StorageType.SqlInt16:
case StorageType.SqlInt32:
return SqlConvert.ConvertToSqlInt32(vLeft).CompareTo(SqlConvert.ConvertToSqlInt32(vRight));
case StorageType.Int64:
case StorageType.UInt32:
case StorageType.SqlInt64:
return SqlConvert.ConvertToSqlInt64(vLeft).CompareTo(SqlConvert.ConvertToSqlInt64(vRight));
case StorageType.UInt64:
case StorageType.SqlDecimal:
return SqlConvert.ConvertToSqlDecimal(vLeft).CompareTo(SqlConvert.ConvertToSqlDecimal(vRight));
case StorageType.SqlDouble:
return SqlConvert.ConvertToSqlDouble(vLeft).CompareTo(SqlConvert.ConvertToSqlDouble(vRight));
case StorageType.SqlSingle:
return SqlConvert.ConvertToSqlSingle(vLeft).CompareTo(SqlConvert.ConvertToSqlSingle(vRight));
case StorageType.SqlString:
return table.Compare(vLeft.ToString(), vRight.ToString());
case StorageType.SqlGuid:
return ((SqlGuid)vLeft).CompareTo(vRight);
case StorageType.SqlBoolean:
if (op == Operators.EqualTo || op == Operators.NotEqual)
{
result = 1;
if (((vLeft.GetType() == typeof(SqlBoolean)) && ((vRight.GetType() == typeof(SqlBoolean)) || (vRight.GetType() == typeof(bool)))) ||
((vRight.GetType() == typeof(SqlBoolean)) && ((vLeft.GetType() == typeof(SqlBoolean)) || (vLeft.GetType() == typeof(bool)))))
{
return SqlConvert.ConvertToSqlBoolean(vLeft).CompareTo(SqlConvert.ConvertToSqlBoolean(vRight));
}
}
break;
case StorageType.SqlBinary:
return SqlConvert.ConvertToSqlBinary(vLeft).CompareTo(SqlConvert.ConvertToSqlBinary(vRight));
case StorageType.SqlDateTime:
return SqlConvert.ConvertToSqlDateTime(vLeft).CompareTo(SqlConvert.ConvertToSqlDateTime(vRight));
case StorageType.SqlMoney:
return SqlConvert.ConvertToSqlMoney(vLeft).CompareTo(SqlConvert.ConvertToSqlMoney(vRight));
}
}
}
catch (System.ArgumentException e)
{
ExceptionBuilder.TraceExceptionWithoutRethrow(e);
}
catch (System.FormatException e)
{
ExceptionBuilder.TraceExceptionWithoutRethrow(e);
}
catch (System.InvalidCastException e)
{
ExceptionBuilder.TraceExceptionWithoutRethrow(e);
}
catch (System.OverflowException e)
{
ExceptionBuilder.TraceExceptionWithoutRethrow(e);
}
catch (System.Data.EvaluateException e)
{
ExceptionBuilder.TraceExceptionWithoutRethrow(e);
}
SetTypeMismatchError(op, vLeft.GetType(), vRight.GetType());
return result;
}