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

EntityFramework Core 使用枚举类型列表过滤jsonb字段查询的问题咨询

解决方案

你使用的是PostgreSQL的jsonb类型存储枚举集合,Npgsql.EntityFrameworkCore.PostgreSQL 提供了原生的JSONB操作支持,以下两种方案均可实现需求:

方案1:使用原生EF.Functions方法(推荐,性能最优)

该方案直接翻译为PostgreSQL原生?|操作符,服务端执行,支持jsonb索引优化。

实现逻辑:

  • 先将入参枚举集合转换为对应数值的字符串数组(匹配jsonb中存储的数值格式)
  • 调用EF.Functions.JsonbExistsAny方法做交集判断
  • 额外处理数据库字段为null的情况

方案2:使用LINQ Any语法

适用于Npgsql 6.0+版本,会自动翻译为正确的SQL语句,写法更简洁。


完整修改后代码
public async Task<List<Emp>> ListEmp(List<Offer> offer)
{
    var query = catalogDb.Emp.Include(a => a.D)
                  .Where(a => a.FullName == "xyz") // 修正原代码字段笔误,实体定义字段为FullName
                  .AsQueryable();

    if (offer?.Count > 0)
    {
        // 方案1代码(二选一即可)
        var offerValueStrings = offer.Select(o => ((int)o).ToString()).ToArray();
        query = query.Where(e => 
            e.offer != null 
            && EF.Functions.JsonbExistsAny(e.offer, offerValueStrings)
        );

        // 方案2代码(不需要可直接注释)
        // query = query.Where(e => 
        //     e.offer != null 
        //     && offer.Any(offerItem => e.offer.Contains(offerItem))
        // );
    }

    return await query.ToListAsync();
}

注意事项
  • 请确保已安装对应版本的Npgsql.EntityFrameworkCore.PostgreSQLNuget包
  • 如果你的枚举在jsonb中存储为字符串形式,只需要将offer.Select(o => ((int)o).ToString())修改为offer.Select(o => o.ToString())即可
  • 若后续需要筛选包含所有入参枚举值的记录,将JsonbExistsAny改为JsonbExistsAll即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:54:04