EFCore使用JSON_VALUE查詢json對象的值 Intro SqlServer 從2016開始支持 JSON 操作,可以使用 JSON_VALUE 查詢 JSON 對象的某個屬性值, "更多介紹" ,現在公司的一些項目主要是使用 EF Core,手寫sql較少,針對比較簡單的 JSON_V ...
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
資料庫中添加了三條測試數據,測試數據如下:
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
Reference
- https://docs.microsoft.com/en-us/sql/t-sql/functions/json-value-transact-sql?view=sql-server-2017
- https://docs.microsoft.com/en-us/sql/relational-databases/json/json-path-expressions-sql-server?view=sql-server-2017
- https://stackoverflow.com/questions/52017204/expression-tree-to-sql-with-ef-core
- https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0#database-scalar-function-mapping