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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM