Отказ от ответственности: хотя это выполнимо, я настоятельно рекомендую вам не использовать преобразование типов в запросе, поскольку это приводит к значительному снижению производительности запроса.
Фактом является то, что Convert.ToInt(x)
часть не является проблема здесь. Это c.ClaimsNumber.Substring(c.ClaimNumber.Length - 6)
, что переводчик EF Core не может переводить в T- SQL.
Несмотря на то, что функция RIGHT
существует на Sql сервере, вы также не сможете используйте его с текущими версиями EF Core (последняя версия 3.1.2 на данный момент я пишу). Единственное решение, чтобы получить то, что вам нужно, - это создать пользовательскую функцию Sql Server, сопоставить ее с EF Core и использовать в своем запросе.
1) Создать функцию с помощью миграции
> dotnet ef migrations add CreateRightFunction
Во вновь созданный файл миграции поместите этот код:
public partial class CreateRightFunctions : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(@"
CREATE FUNCTION fn_Right(@input nvarchar(4000), @howMany int)
RETURNS nvarchar(4000)
BEGIN
RETURN RIGHT(@input, @howMany)
END
");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(@"
DROP FUNCTION fn_Right
");
}
}
Затем запустите обновление базы данных:
dotnet ef database update
2) Сопоставить функцию с контекстом EF Core
В вашем контексте класса [DbFunction ("fn_Right")]
public static string Right(string input, int howMany)
{
throw new NotImplementedException(); // this code doesn't get executed; the call is passed through to the database function
}
3) Используйте функцию в вашем запросе
var maxId = Db.Claims.Select(c => MyContext.Right(c.ClaimNumber, 6)).Max(x => Convert.ToInt32(x));
Сгенерированный запрос:
SELECT MAX(CONVERT(int, [dbo].[fn_Right]([c].[ClaimNumber], 6)))
FROM [Claims] AS [c]
Опять же, это далеко не лучшая практика, я думаю, вам следует подумать о добавлении столбца int в таблицу для хранения этого "числа", независимо от того, что оно представляет в вашем домене.
Кроме того, впервые 6 последних символов ClaimNumber содержат не-ди git символ, это больше не будет работать. Если ClaimNumber вводится человеком, рано или поздно это произойдет.
Вам следует создать код и спроектировать базу данных и приложение для надежности, даже если вы уверены, что эти 6 символов всегда будут представлять число , Они не могли делать это вечно:)