Во-первых, поздравляем с обнаружением трюка Cast<T>()
!Похоже, это единственный готовый EF6 способ приведения string
к чему-либо еще - все другие попытки, такие как (int)(object)stringValue
или Convert.ToInt32(stringValue)
, просто блокируются как не поддерживаемые.
Но обратите внимание, что *Метод 1007 * определен для IEnumerable
и IQueryable
, а результат равен соответственно IEnumerable<T>
и IQueryable<T>
, т.е. работает с последовательностью и создает последовательность.Он появляется на string
, потому что string
- это IEnumerable<char>
, то есть IEnumerable
, но это не то, что нам нужно.
Так что хитрость заключается в том, чтобы всегда использовать проекцию (Select
) + Cast
делать преобразования.Применение его к вашему запросу приводит к чему-то вроде этого:
int nextNotificationMaxRegCodeNumericInt = db.Notifications
.Where(n => n.Reg_Code != null &&
!n.Reg_Code.Contains("[a-z]") &&
SqlFunctions.IsNumeric(n.Reg_Code) == 1)
.Select(n => n.Reg_Code).Cast<int>() // <--
.Select(reg_Code => reg_Code + 1)
.Where(reg_Code => !db.Notifications.Select(n => n.Reg_Code).Cast<int>() // <--
.Contains(reg_Code))
.OrderByDescending(reg_Code => reg_Code)
.FirstOrDefault();
, который преобразуется в
SELECT TOP (1)
[Project1].[C1] AS [C1]
FROM ( SELECT
CAST( [Extent1].[Reg_Code] AS int) + 1 AS [C1]
FROM [dbo].[Notifications] AS [Extent1]
WHERE ([Extent1].[Reg_Code] IS NOT NULL) AND ( NOT ([Extent1].[Reg_Code] LIKE N'%~[a-z]%' ESCAPE N'~')) AND (1 = (ISNUMERIC([Extent1].[Reg_Code])))
) AS [Project1]
WHERE NOT EXISTS (SELECT
1 AS [C1]
FROM [dbo].[Notifications] AS [Extent2]
WHERE CAST( [Extent2].[Reg_Code] AS int) = [Project1].[C1]
)
ORDER BY [Project1].[C1] DESC