【问题标题】:C# query JSON column in a SQL Server table to get the matching rowsC# 查询 SQL Server 表中的 JSON 列以获取匹配的行
【发布时间】: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 语句硬编码到控制器中......

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

【问题讨论】:

    标签: c# .net json sql-server entity-framework


    【解决方案1】:

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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-19
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多