Entity Framework Core 8 Где IN и Где IN OPENJSONC#

Место общения программистов C#
Anonymous
Entity Framework Core 8 Где IN и Где IN OPENJSON

Сообщение Anonymous »

EF Core 8 теперь встраивает значения в операторыwhere, используя комбинацию WHERE IN и OPENJSON, в отличие от предыдущей версии WHERE IN(...).
Это изменение отмечено в документации, и указанная причина заключается в следующем:

Встраивание значений здесь выполняется таким образом, что исключает
вероятность атаки SQL-инъекцией. Изменение использования JSON, описанное
ниже, касается производительности и не имеет ничего общего с безопасностью.

К сожалению, производительность OPENJSON на нашем экземпляре SQL Server 2017 года низкая.
Приведенный ниже запрос, сгенерированный EF Core 8, выполняется 1,8 секунды и приводит к почти 400 000 читает:

Код: Выделить всё

DECLARE @__scheduleTagIds_0 nvarchar(4000) = N'[5835,5970,6563,6564,6565,6645,6835,6850,7034,7127]';

SELECT  [s].[ScheduleTagId]
,[s].[MustStartProdBy]
FROM    [ScheduleTagMustStartBy] AS [s]
WHERE   [s].[ScheduleTagId] IN (
SELECT  [s0].[value]
FROM    OPENJSON(@__scheduleTagIds_0) WITH ([value] int '$') AS [s0]
)
Если я реорганизую запрос с использованием стандартного WHERE IN(...), время выполнения упадет до 120 мс и 29 000 операций чтения:

Код: Выделить всё

SELECT  [s].[ScheduleTagId]
,[s].[MustStartProdBy]
FROM    [ScheduleTagMustStartBy] AS [s]
WHERE   [s].[ScheduleTagId] IN (5835,5970,6563,6564,6565,6645,6835,6850,7034,7127)
В моем приложении есть сотни запросов, использующих .Where(x => [collection].Contains(x.Id)), и я очень обеспокоен снижением производительности, которое я наблюдаю в некоторых запросах.
Вопрос
Что я могу сделать, чтобы решить эту проблему? Я открыт для вариантов как в EF, так и на стороне SQL Server (хотя я не хочу менять уровень совместимости базы данных).

Вернуться в «C#»