Как использовать JSON_VALUE в предложении WHERE с преобразованием типов в CodeFirst - PullRequest
1 голос
/ 31 мая 2019

У меня есть заказ с конкретными данными. Хранит заказы в таблице 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? Или может быть есть другие способы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...