У меня есть заказ с конкретными данными. Хранит заказы в таблице dbo.Orders, в которой есть поле SpecificData (nvarchar (max)) для json-данных.
Сначала я использую EF Code. Для JSON_VALUE я написал перевод DBFunction, используя этот ответ (https://stackoverflow.com/a/50490674/1411598), но столкнулся с проблемой при попытке добавить условие WHERE с типом INT.
if (specificFilter.RegionIds != null && specificFilter.RegionIds.Count() > 0)
{
query = query.Where(g => specificFilter.RegionIds.Contains(DbFunc.JsonValue(g.specificData, "$.RegionId")));
}
Поскольку функция JsonValue возвращает только строку, я не могу добавить предложение с «содержит».
Подумайте немного, я пытаюсь написать функцию преобразования UDF и преобразования в объект EF.
Вот по коду:
if (specificFilter.RegionIds != null && specificFilter.RegionIds.Count() > 0)
{
query = query.Where(g => specificFilter.RegionIds.Contains(DbFunc.ConvertToInt(DbFunc.JsonValue(g.specificData, "$.RegionId"))));
}
UDF очень прост
CREATE FUNCTION [dbo].[ConvertToInt] (@value nvarchar(100))
returns int
AS
BEGIN
return convert(INT, @value)
END
Работает нормально, но запрос слишком медленный:
WHERE (0 = [Extent1].[Status])
AND ([dbo].[ConvertToInt](JSON_VALUE([Extent1].[specificData], N''$.RegionId'')) IN (1))
Это плохо, потому что если у меня много строк, запрос работает очень медленно (UDF выполняется для каждой строки)
Так, вы можете помочь мне найти решение?
Я хочу наконец получить такой запрос:
WHERE (0 = [Extent1].[Status])
AND (CAST(JSON_VALUE([Extent1].[specificData], N''$.RegionId'') as int) IN (1))
Другими словами, могу ли я перевести функцию CAST или CONVER в функцию EF DBFunction? Или может быть есть другие способы?