使用 Entity Framework Core 的 SQL Server 查询中的参数化 OPENJSON

Posted

技术标签:

【中文标题】使用 Entity Framework Core 的 SQL Server 查询中的参数化 OPENJSON【英文标题】:Parameterized OPENJSON in SQL Server query using Entity Framework Core 【发布时间】:2019-02-09 08:36:19 【问题描述】:
context.Set<BlogKeyValuePair>()
   .FromSql("SELECT [key], value FROM OPENJSON((SELECT JsonData FROM dbo.Blogs WHERE BlogId=1), '$.@path')", 
        new SqlParameter("@path", "path.to.data"));

乍一看,这应该可以正常工作,@path 应该被 path.to.data 替换,但事实并非如此,抛出 SqlException 并出现以下错误:

System.Data.SqlClient.SqlException:'@path' 附近的语法不正确。

似乎 SQL Server 不会替换参数,因为它是 OPENJSON 函数内的参数。

寻找安全的解决方法。

【问题讨论】:

分享完整的堆栈跟踪! 【参考方案1】:

这在 SSMS 中适用于我,所以 @marsze 的回答应该有效。

declare @path nvarchar(2000) = 'ArrayValue';

DECLARE @json NVARCHAR(4000) = N'  
   "StringValue":"John",  
   "IntValue":45,  
   "TrueValue":true,  
   "FalseValue":false,  
   "NullValue":null,  
   "ArrayValue":["a","r","r","a","y"],  
   "ObjectValue":"obj":"ect"  
'

SELECT *
FROM OPENJSON(@json, '$.' + @path)

【讨论】:

我正在完全复制它,但我仍然收到“'+' 附近的语法不正确”。知道为什么吗? @J.Doe 如果您更改了代码,请在您的问题中添加新代码!【参考方案2】:

SQL 无法识别该变量,因为您将它放在一个字符串中:

-- Wrong:
OPENJSON((SELECT JsonData FROM dbo.Blogs WHERE BlogId = 1), '$.@path')

-- Correct:
OPENJSON((SELECT JsonData FROM dbo.Blogs WHERE BlogId = 1), '$.' + @path)

代码:

context
    .Set<BlogKeyValuePair>()
    .FromSql(@"
        SELECT [key], value
        FROM OPENJSON((SELECT JsonData FROM dbo.Blogs WHERE BlogId = 1), '$.' + @path)",
        new SqlParameter("@path", "path.to.data"));

【讨论】:

这对我不起作用。你自己检查过吗?也许我错过了一些东西。我收到“'+' 附近的语法不正确。” 尝试将两个字符串连接到 SSMS 或任何其他用于管理数据库的工具中的 OPENJSON 路径参数中。 @J.Doe 这应该可以正常工作,David Browne 的 SQL 也对我有用。不知道为什么它会给你语法错误。你在 SMSS 里面试过吗?似乎不是代码,而是其他东西被破坏了。您是否尝试过使用纯字符串作为不带参数的路径?您是否尝试将完整路径放入参数中,包括。 $.? 是的,我在 SMSS 内部尝试过。是的,我尝试在没有参数的情况下使用纯字符串作为路径,它确实有效。是的,我的参数中的$. @J.Doe 如果尝试使用 System.Data.SqlClient 下的 .NET 功能使用 David Browne 的 SQL,即使使用参数也可以正常工作。我想知道 EF Core 是否执行一些内部语法检查?不过我不相信。

以上是关于使用 Entity Framework Core 的 SQL Server 查询中的参数化 OPENJSON的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 性能优化

在 Entity Framework Core 中使用 [ComplexType]

在 Entity Framework Core 中使用 SQL 视图

使用 Entity Framework Core 更新相关数据

使用 Entity Framework Core 自动增加部分主键

如何使用 Entity Framework Core 模拟异步存储库