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();
}
}
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; }
}
数据库中添加了三条测试数据
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();
我这里通过 log4net 记录执行的 sql 语句,监控到执行的sql语句如下:
SELECT JSON_VALUE([t].[Extra], N'$.Name')
FROM [TestEntities] AS [t]
原文:https://www.cnblogs.com/weihanli/p/use-json-value-in-ef-core.html