EFCore使用JSON_VALUE查询json对象的值

Posted Love it or leave it

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EFCore使用JSON_VALUE查询json对象的值相关的知识,希望对你有一定的参考价值。

EFCore使用JSON_VALUE查询json对象的值

Intro

SqlServer 从2016开始支持 JSON 操作,可以使用 JSON_VALUE 查询 JSON 对象的某个属性值,更多介绍,现在公司的一些项目主要是使用 EF Core,手写sql较少,针对比较简单的 JSON_VALUE 查询想通过 DbFunction 来实现,于是就有了这篇文章的探索。

定义 JSON_VALUE DbFunction

    public static class DbFunctions
    {
        [DbFunction("JSON_VALUE", "")]
        public static string JsonValue(string column, [NotParameterized] string path)
        {
            throw new NotSupportedException();
        }
    }

在 DbContext 中注册 DbFunction

重写 DbContext 的 OnModelCreating 方法,在 OnModelCreating 方法中注册 DbFunction

    public class TestDbContext : DbContext
    {
        public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
        {
        }

        public DbSet<TestEntity> TestEntities { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.HasDbFunction(() => DbFunctions.JsonValue(default(string), default(string)));
        }
    }

    public class TestEntity
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        public string Extra { get; set; }

        public DateTime CreatedAt { get; set; }
    }

使用注册的 DbFunction 查询 JSON_VALUE

数据库中添加了三条测试数据,测试数据如下:

sample data

var loggerFactory = new LoggerFactory();
loggerFactory.AddLog4Net();

var optionsBuilder = new DbContextOptionsBuilder<TestDbContext>()
                .UseLoggerFactory(loggerFactory)
                .UseSqlServer("server=.;database=Test;Integrated Security=True");

var db = new TestDbContext(optionsBuilder.Options);

var names = db.TestEntities.AsNoTracking().Select(t => DbFunctions.JsonValue(t.Extra, "$.Name")).ToArray();

监控生成的Sql语句

我这里通过 log4net 记录执行的 sql 语句,监控到执行的sql语句如下:

SELECT JSON_VALUE([t].[Extra], N\'$.Name\')
FROM [TestEntities] AS [t]

Source

示例代码: https://github.com/WeihanLi/WeihanLi.EntityFramework/blob/master/samples/WeihanLi.EntityFramework.Samples/Program.cs

Reference

以上是关于EFCore使用JSON_VALUE查询json对象的值的主要内容,如果未能解决你的问题,请参考以下文章

SQL JSON_VALUE 查询但没有路径名?

SQL Server JSON_VALUE 语法

C#Dapper使用JSON_VALUE进行SQL Server 2016

在 PL/SQL 中出现错误“PLS-00201:必须声明标识符‘JSON_VALUE’”

使用 JSON_VALUE 访问 SQL Server 2016 中的 JSON 数组

将具有 JSON 字段的选择结果转换为 JSON,并将该数据与 JSON_VALUE() 一起使用