После обновления до EF Core 3 я получаю следующую ошибку в следующем коде:
System.InvalidOperationException: 'Выражение LINQ' DbSet .Max(c => Convert.ToInt32(c.ClaimNumber.Substring(c.ClaimNumber.Length - 6)))' не может быть переведено. Либо перепишите запрос в форме, которую можно перевести, либо явно переключитесь на оценку клиента, вставив вызов AsEnumerable(), AsAsyncEnumerable(), ToList() или ToListAsync(). См. https://go.microsoft.com/fwlink/?linkid=2101038. Чтобы получить больше информации.'
var maxId = Db.Claims
.Select(c => c.ClaimNumber.Substring(c.ClaimNumber.Length - 6))
.Max(x => Convert.ToInt32(x));
Я также пытался использовать int.Parse вместо Convert.ToInt32, и он выдает ту же ошибку. Я понимаю сообщение об ошибке. Тем не менее, заставить SQL Server анализировать строку в int в T-SQL с помощью CAST или CONVERT очень просто, я надеюсь, что есть простой способ написать запрос, чтобы он транслировался в операцию на стороне сервера, верно?
ОБНОВЛЕНИЕ После отличного ответа Клаудио я подумал, что должен добавить некоторую информацию для следующего человека, который придет. Причина, по которой я считал, что синтаксический анализ был проблемой с приведенным выше кодом, заключается в том, что следующее выполняется без ошибок и дает правильный результат:
var maxId = Db.Claims
.Select(c => c.ClaimNumber.Substring(c.ClaimNumber.Length - 6))
.AsEnumerable()
.Max(x => int.Parse(x));
Однако я копнул глубже и обнаружил, что это SQL-запрос, который EF выполняет из этого кода:
SELECT [c].[ClaimNumber], CAST(LEN([c].[ClaimNumber]) AS int) - 6
FROM [Claims] AS [c]
WHERE [c].[ClaimNumber] IS NOT NULL
Это явно не делает ничего подобного тому, что я хотел, и поэтому Клаудио прав в том, что вызов Substring
на самом деле является проблемой.