如何在CodeFirst中将WHERE子句中的JSON_VALUE与类型转换一起使用

时间:2019-05-31 08:57:17

标签: c# json entity-framework ef-code-first

我有一个包含特定数据的订单。订单存储在dbo.Orders表中,该表具有json-data的SpecificData字段(nvarchar(max))。 我首先使用EF代码。对于JSON_VALUE,我使用此答案(https://stackoverflow.com/a/50490674/1411598)编写了DBFunction转换,但是当我尝试添加INT类型的WHERE条件时遇到了一个问题。

if (specificFilter.RegionIds != null && specificFilter.RegionIds.Count() > 0)
{
   query = query.Where(g => specificFilter.RegionIds.Contains(DbFunc.JsonValue(g.specificData, "$.RegionId")));
}

因为JsonValue函数仅返回字符串,所以我无法添加带有“ contains”的子句。 想一想,我尝试编写转换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)) 

换句话说,我可以在EF DBFunction中转换CAST或CONVER函数吗?还是可能有其他方法?

0 个答案:

没有答案