我有一个包含特定数据的订单。订单存储在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函数吗?还是可能有其他方法?