diff --git a/src/EFCore.SqlServer/Query/Internal/Translators/SqlServerConvertTranslator.cs b/src/EFCore.SqlServer/Query/Internal/Translators/SqlServerConvertTranslator.cs index 8e3d2e9da29..5bd07b1a8a9 100644 --- a/src/EFCore.SqlServer/Query/Internal/Translators/SqlServerConvertTranslator.cs +++ b/src/EFCore.SqlServer/Query/Internal/Translators/SqlServerConvertTranslator.cs @@ -37,7 +37,8 @@ public class SqlServerConvertTranslator : IMethodCallTranslator typeof(int), typeof(long), typeof(short), - typeof(string) + typeof(string), + typeof(object) ]; private static readonly MethodInfo[] SupportedMethods diff --git a/test/EFCore.Specification.Tests/Query/NorthwindFunctionsQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/NorthwindFunctionsQueryTestBase.cs index b21d0d36be6..df0db9f36db 100644 --- a/test/EFCore.Specification.Tests/Query/NorthwindFunctionsQueryTestBase.cs +++ b/test/EFCore.Specification.Tests/Query/NorthwindFunctionsQueryTestBase.cs @@ -1312,6 +1312,7 @@ public virtual async Task Convert_ToBoolean(bool async) o => Convert.ToBoolean(Convert.ToInt16(o.OrderID % 3)), o => Convert.ToBoolean(Convert.ToInt32(o.OrderID % 3)), o => Convert.ToBoolean(Convert.ToInt64(o.OrderID % 3)), + o => Convert.ToBoolean((object)Convert.ToInt32(o.OrderID % 3)) }; foreach (var convertMethod in convertMethods) @@ -1337,7 +1338,8 @@ public virtual async Task Convert_ToByte(bool async) o => Convert.ToByte(Convert.ToInt16(o.OrderID % 1)) >= 0, o => Convert.ToByte(Convert.ToInt32(o.OrderID % 1)) >= 0, o => Convert.ToByte(Convert.ToInt64(o.OrderID % 1)) >= 0, - o => Convert.ToByte(Convert.ToString(o.OrderID % 1)) >= 0 + o => Convert.ToByte(Convert.ToString(o.OrderID % 1)) >= 0, + o => Convert.ToByte((object)Convert.ToString(o.OrderID % 1)) >= 0 }; foreach (var convertMethod in convertMethods) @@ -1363,7 +1365,8 @@ public virtual async Task Convert_ToDecimal(bool async) o => Convert.ToDecimal(Convert.ToInt16(o.OrderID % 1)) >= 0, o => Convert.ToDecimal(Convert.ToInt32(o.OrderID % 1)) >= 0, o => Convert.ToDecimal(Convert.ToInt64(o.OrderID % 1)) >= 0, - o => Convert.ToDecimal(Convert.ToString(o.OrderID % 1)) >= 0 + o => Convert.ToDecimal(Convert.ToString(o.OrderID % 1)) >= 0, + o => Convert.ToDecimal((object)Convert.ToString(o.OrderID % 1)) >= 0 }; foreach (var convertMethod in convertMethods) @@ -1389,7 +1392,8 @@ public virtual async Task Convert_ToDouble(bool async) o => Convert.ToDouble(Convert.ToInt16(o.OrderID % 1)) >= 0, o => Convert.ToDouble(Convert.ToInt32(o.OrderID % 1)) >= 0, o => Convert.ToDouble(Convert.ToInt64(o.OrderID % 1)) >= 0, - o => Convert.ToDouble(Convert.ToString(o.OrderID % 1)) >= 0 + o => Convert.ToDouble(Convert.ToString(o.OrderID % 1)) >= 0, + o => Convert.ToDouble((object)Convert.ToString(o.OrderID % 1)) >= 0 }; foreach (var convertMethod in convertMethods) @@ -1415,7 +1419,8 @@ public virtual async Task Convert_ToInt16(bool async) o => Convert.ToInt16(Convert.ToInt16(o.OrderID % 1)) >= 0, o => Convert.ToInt16(Convert.ToInt32(o.OrderID % 1)) >= 0, o => Convert.ToInt16(Convert.ToInt64(o.OrderID % 1)) >= 0, - o => Convert.ToInt16(Convert.ToString(o.OrderID % 1)) >= 0 + o => Convert.ToInt16(Convert.ToString(o.OrderID % 1)) >= 0, + o => Convert.ToInt16((object)Convert.ToString(o.OrderID % 1)) >= 0 }; foreach (var convertMethod in convertMethods) @@ -1441,7 +1446,8 @@ public virtual async Task Convert_ToInt32(bool async) o => Convert.ToInt32(Convert.ToInt16(o.OrderID % 1)) >= 0, o => Convert.ToInt32(Convert.ToInt32(o.OrderID % 1)) >= 0, o => Convert.ToInt32(Convert.ToInt64(o.OrderID % 1)) >= 0, - o => Convert.ToInt32(Convert.ToString(o.OrderID % 1)) >= 0 + o => Convert.ToInt32(Convert.ToString(o.OrderID % 1)) >= 0, + o => Convert.ToInt32((object)Convert.ToString(o.OrderID % 1)) >= 0 }; foreach (var convertMethod in convertMethods) @@ -1467,7 +1473,8 @@ public virtual async Task Convert_ToInt64(bool async) o => Convert.ToInt64(Convert.ToInt16(o.OrderID % 1)) >= 0, o => Convert.ToInt64(Convert.ToInt32(o.OrderID % 1)) >= 0, o => Convert.ToInt64(Convert.ToInt64(o.OrderID % 1)) >= 0, - o => Convert.ToInt64(Convert.ToString(o.OrderID % 1)) >= 0 + o => Convert.ToInt64(Convert.ToString(o.OrderID % 1)) >= 0, + o => Convert.ToInt64((object)Convert.ToString(o.OrderID % 1)) >= 0 }; foreach (var convertMethod in convertMethods) @@ -1494,6 +1501,7 @@ public virtual async Task Convert_ToString(bool async) o => Convert.ToString(Convert.ToInt32(o.OrderID % 1)) != "10", o => Convert.ToString(Convert.ToInt64(o.OrderID % 1)) != "10", o => Convert.ToString(Convert.ToString(o.OrderID % 1)) != "10", + o => Convert.ToString((object)Convert.ToString(o.OrderID % 1)) != "10", o => Convert.ToString(o.OrderDate.Value).Contains("1997") || Convert.ToString(o.OrderDate.Value).Contains("1998") }; diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServerTest.cs index ae4e0c9cbdd..d07116de05e 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServerTest.cs @@ -1833,6 +1833,12 @@ FROM [Orders] AS [o] SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] FROM [Orders] AS [o] WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(bit, CONVERT(bigint, [o].[OrderID] % 3)) = CAST(1 AS bit) +""", + // + """ +SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] +FROM [Orders] AS [o] +WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(bit, CONVERT(int, [o].[OrderID] % 3)) = CAST(1 AS bit) """); } @@ -1893,6 +1899,12 @@ FROM [Orders] AS [o] SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] FROM [Orders] AS [o] WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(tinyint, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= CAST(0 AS tinyint) +""", + // + """ +SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] +FROM [Orders] AS [o] +WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(tinyint, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= CAST(0 AS tinyint) """); } @@ -1953,6 +1965,12 @@ FROM [Orders] AS [o] SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] FROM [Orders] AS [o] WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(decimal(18, 2), CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= 0.0 +""", + // + """ +SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] +FROM [Orders] AS [o] +WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(decimal(18, 2), CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= 0.0 """); } @@ -2013,6 +2031,12 @@ FROM [Orders] AS [o] SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] FROM [Orders] AS [o] WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(float, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= 0.0E0 +""", + // + """ +SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] +FROM [Orders] AS [o] +WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(float, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= 0.0E0 """); } @@ -2073,6 +2097,12 @@ FROM [Orders] AS [o] SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] FROM [Orders] AS [o] WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(smallint, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= CAST(0 AS smallint) +""", + // + """ +SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] +FROM [Orders] AS [o] +WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(smallint, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= CAST(0 AS smallint) """); } @@ -2133,6 +2163,12 @@ FROM [Orders] AS [o] SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] FROM [Orders] AS [o] WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(int, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= 0 +""", + // + """ +SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] +FROM [Orders] AS [o] +WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(int, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= 0 """); } @@ -2193,6 +2229,12 @@ FROM [Orders] AS [o] SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] FROM [Orders] AS [o] WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(bigint, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= CAST(0 AS bigint) +""", + // + """ +SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] +FROM [Orders] AS [o] +WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(bigint, CONVERT(nvarchar(max), [o].[OrderID] % 1)) >= CAST(0 AS bigint) """); } @@ -2258,6 +2300,12 @@ FROM [Orders] AS [o] """ SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] FROM [Orders] AS [o] +WHERE [o].[CustomerID] = N'ALFKI' AND CONVERT(nvarchar(max), CONVERT(nvarchar(max), [o].[OrderID] % 1)) <> N'10' +""", + // + """ +SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] +FROM [Orders] AS [o] WHERE [o].[CustomerID] = N'ALFKI' AND (CONVERT(nvarchar(max), [o].[OrderDate]) LIKE N'%1997%' OR CONVERT(nvarchar(max), [o].[OrderDate]) LIKE N'%1998%') """); }