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 列以获取匹配的行的主要内容,如果未能解决你的问题,请参考以下文章
使用 C# 在 ASP.NET 中检查 SQL Server 表中的列值是不是为空
解析 JSON 数据并插入到 SQL Server 中的多个表中