You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在经典.NET的EF 6 Code First中使用SQL Server JSON_VALUE函数

在EF 6 Code First(.NET 4.6.1)中使用SQL Server的JSON_VALUE函数

我来帮你搞定EF 6里调用SQL Server JSON_VALUE函数的问题,毕竟EF 6和EF Core的函数注册逻辑确实有差异,咱们一步步来实现:

1. 定义静态扩展方法

首先创建一个静态类,定义对应的方法(运行时EF会将其映射到数据库的JSON_VALUE函数,所以方法体只需抛出NotSupportedException即可):

public static class JsonExtensions
{
    // EF 6中不需要[NotParameterized]特性,参数处理在注册时配置
    public static string JsonValue(string jsonColumn, string jsonPath)
    {
        throw new NotSupportedException("此方法仅用于EF LINQ查询映射,不能直接调用");
    }
}

2. 在DbContext的OnModelCreating中注册函数

EF 6使用DbModelBuilder.RegisterFunction来注册数据库函数,关键是要把JSON路径参数设置为字面量(IsLiteral = true),避免EF将其参数化,否则SQL Server无法正确解析JSON路径:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    // 注册JSON_VALUE函数
    var jsonValueFunction = modelBuilder.RegisterFunction("JSON_VALUE")
        .HasReturnType<string>()
        .HasParameter("jsonColumn", typeof(string))
        .HasParameter("jsonPath", typeof(string));
    
    // 关键配置:将jsonPath标记为字面量,防止被参数化
    jsonValueFunction.Parameter("jsonPath").IsLiteral = true;
}

3. 在LINQ查询中使用

和EF Core的用法类似,直接在LINQ查询里调用静态方法即可,EF会自动将其转换为SQL Server的JSON_VALUE函数:

using (var db = new YourDbContext())
{
    // 示例:从Blogs表的Log字段中提取$.JsonPropertyName对应的JSON值
    var result = db.Blogs
        .Select(t => JsonExtensions.JsonValue(t.Log, "$.JsonPropertyName"))
        .ToArray();
}

注意事项

  • 确保你的SQL Server版本支持JSON函数:需要SQL Server 2016及以上版本。
  • 确认你的EF 6版本足够新:建议使用EF 6.1.3及以上版本,避免兼容性问题。

内容的提问来源于stack exchange,提问作者Jonatan Dragon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:49:20