C# 查询 SQL Server 表中的 JSON 列以获取匹配的行

Posted

技术标签:

【中文标题】C# 查询 SQL Server 表中的 JSON 列以获取匹配的行【英文标题】:C# query JSON column in a SQL Server table to get the matching rows 【发布时间】:2019-12-07 06:16:34 【问题描述】:

Json 字符串更新为 SQL Server 的列之一,我想要符合我的条件的行并将其存储到集合中。在这种情况下,我将条件应用于 json 键/名称以获取数据。我借助sqlquery 函数在实体框架中实现了它。但我试图找到针对相同情况的其他选项,可能是 linq 或 lambda。

例如它是一个包含 3 列的电影表,其中 Movie_info 列是一个包含 Json 字符串的 NVarChar

 id: 1
 Storyline: "Blah Blah!!"
 Movie_info ["title":"The Shawshank Redemption","year":1994,"cast":["Morgan 
 Freeman", "Tim Robbins"]]`

 id: 2
 Storyline: "free from corruption."
 Movie_info ["title":"Batman Begins","year":2005,"cast":[],"Director": 
 "Christopher Nolan"]
 .
 ..
 ...

我正在尝试过滤 2005 年发行的电影。下面是我尝试过的代码,它成功了。

using (MoviesDbContext ctx = new MoviesDbContext())

    var movieList = ctx.Movies.SqlQuery("SELECT * FROM [Movie].[dbo].[Movies] 
                                         WHERE JSON_VALUE(Movie_info, '$.year') = @value", 
                                        new SqlParameter("@value", 2005)).ToList();

通过这段代码,我得到了 2005 年发布的电影列表。我怎样才能使用 Lambda 或使用 Linq 查询来实现相同的目标,因为我不想将 SQL 语句硬编码到控制器中......

我期待同样的结果。非常感谢您对任何其他方法的建议..

【问题讨论】:

【参考方案1】:

来自visualstudiomagazine.com 目前,Entity Framework 或 LINQ 不支持利用 TSQL JSON 功能。

【讨论】:

谢谢 Nabi,您有什么建议可以避免将 sql 查询硬编码到代码中吗? 您可以利用 nameof() 运算符或反射,但我个人更喜欢将原始查询移动到资源文件,以便我可以轻松地操作它们。将查询放在单独的库中也会有很大帮助。 经过一些研究,我知道存储过程是摆脱这种情况的一种方法,因为 C# 中的反射效率不高。您对此有何看法? 这取决于你的情况。例如,存储过程是否在源控制器下?这个链接可能有用。 ***.com/questions/15142/…【参考方案2】:

您可以使用反射来获取请求的 JSON 项目的属性名称以将其放入查询中,但请注意反射很慢。欲了解更多信息,请参阅 https://www.tutorialspoint.com/csharp/csharp_reflection.htm

【讨论】:

以上是关于C# 查询 SQL Server 表中的 JSON 列以获取匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中的 JSON 数据

通过c#代码检索存储在sql表中的Json值的最佳实践

使用 C# 在 ASP.NET 中检查 SQL Server 表中的列值是不是为空

解析 JSON 数据并插入到 SQL Server 中的多个表中

需要 SQL 查询帮助以解析 BigQuery 表中的 JSON 数据

C#中如何用Linq在SQL Server的表中多列检索多个关键字