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

Linq-to-DB多数据库适配:SQL Server与PostgreSQL函数兼容问题

多数据库兼容(SQL Server/PostgreSQL)下的JSON验证实现方案

针对你遇到的Linq-to-DB跨数据库兼容问题,提供两种实用解决方案:

方案1:基于数据库提供者的条件分支查询

直接通过Linq-to-DB的Sql.IsCurrentProvider判断当前数据库类型,执行对应过滤逻辑:

var invoiceQuery = db.Invoice.ToLinqToDB();

// SQL Server环境下使用ISJSON函数
if (Sql.IsCurrentProvider(SqlServerProvider.Name))
{
    invoiceQuery = invoiceQuery.Where(i => SqlFn.IsJson(i.InvoiceState) == true);
}
// PostgreSQL环境下可选处理:要么忽略验证(返回所有数据),要么用PostgreSQL原生JSON验证函数
else if (Sql.IsCurrentProvider(PostgreSQLProvider.Name))
{
    // 选项A:忽略JSON验证,直接返回全部数据
    // 选项B:使用PostgreSQL 12+支持的json_valid函数做验证
    invoiceQuery = invoiceQuery.Where(i => Sql.Ext.JsonValid(i.InvoiceState) == true);
}

var d1 = invoiceQuery.ToList();

说明:

  • 如果PostgreSQL场景不需要验证JSON合法性,直接跳过else if分支即可;
  • Sql.Ext.JsonValid是Linq-to-DB对PostgreSQL原生json_valid函数的封装,需确保PostgreSQL版本≥12。

方案2:自定义通用JSON验证函数(推荐)

通过Linq-to-DB的函数映射特性,封装统一的验证方法,底层自动适配不同数据库:

  1. 创建自定义函数扩展类:
using LinqToDB;
using LinqToDB.DataProvider.PostgreSQL;
using LinqToDB.DataProvider.SqlServer;

public static class CustomJsonFunctions
{
    // 映射SQL Server的ISJSON函数
    [Sql.Function(Name = "ISJSON", ServerSideOnly = true, ProviderName = SqlServerProvider.Name)]
    // 映射PostgreSQL的json_valid函数
    [Sql.Function(Name = "json_valid", ServerSideOnly = true, ProviderName = PostgreSQLProvider.Name)]
    public static bool IsValidJson(string jsonContent)
    {
        // 客户端模拟实现(仅用于Linq表达式解析,实际执行会替换为数据库原生函数)
        try
        {
            System.Text.Json.JsonDocument.Parse(jsonContent);
            return true;
        }
        catch
        {
            return false;
        }
    }
}
  1. 统一调用自定义函数:
var d1 = db.Invoice
           .ToLinqToDB()
           .Where(i => CustomJsonFunctions.IsValidJson(i.InvoiceState))
           .ToList();

说明:

  • 此方案代码更简洁,无需手动判断数据库类型;
  • 如果PostgreSQL版本低于12,可将json_valid替换为兼容写法,比如用json_typeof判断:
    [Sql.Function(Name = "json_typeof", ServerSideOnly = true, ProviderName = PostgreSQLProvider.Name)]
    public static string JsonType(string jsonContent) => "";
    // 查询时使用:Where(i => CustomJsonFunctions.JsonType(i.InvoiceState) != "null")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:03:19