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

EF Core操作PostgreSQL jsonb数组:筛选Price>123行的方案

解决方案:PostgreSQL JSONB数组元素条件查询(EF Core)

方法1:直接执行原生SQL

复用你已经验证有效的PostgreSQL语句,通过EF Core的FromSqlRaw直接执行,避免本地过滤:

var result = _dbContext.Table1
    .FromSqlRaw(@"
        SELECT *
        FROM ""Table1""
        WHERE jsonb_path_exists(
            ""HistoryPrices"",
            '$[0] ? (@.Price > 123)'
        )
    ")
    .ToList();

注意:要确保SQL中的表名、列名和数据库实际名称一致(PostgreSQL默认区分大小写,EF Core映射的名称可能需要加双引号)。

方法2:映射PostgreSQL内置函数到EF Core

把PostgreSQL的jsonb_path_exists函数注册为EF Core可识别的DbFunction,这样就能在LINQ中直接调用:

  1. 在你的DbContext类中添加函数定义:
[DbFunction("jsonb_path_exists", IsBuiltIn = true)]
public static bool JsonbPathExists(string jsonbColumn, string pathExpression)
{
    // 这个方法只用于EF Core的SQL翻译,不会实际执行
    throw new NotImplementedException("仅用于EF Core查询转换");
}
  1. 用LINQ查询时调用该函数:
var result = _dbContext.Table1
    .Where(p => JsonbPathExists(p.HistoryPrices, "$[0] ? (@.Price > 123)"))
    .ToList();

这样EF Core会自动把这个调用翻译成对应的PostgreSQL SQL,完全在数据库端执行。

方法3:利用Npgsql EF Core驱动的JSON扩展

如果你使用的是Npgsql官方的EF Core驱动,可以用它提供的JSON操作扩展来直接访问数组元素:

// 需要引用Npgsql.EntityFrameworkCore.PostgreSQL包
var result = _dbContext.Table1
    .Where(p => EF.Functions.JsonbArrayElement(p.HistoryPrices, 0).GetValue<int>("Price") > 123)
    .ToList();

部分新版本的Npgsql也支持更简洁的写法:

var result = _dbContext.Table1
    .Where(p => p.HistoryPrices.JsonbElementAt(0).GetValue<int>("Price") > 123)
    .ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:39:58