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
相关产品推荐
相关产品推荐

