如何在Select2查询/PXProjection中使用BQL IN运算符处理动态值列表
正确实现方案
- 调整缓存扩展字段类型
BQL的In<>运算符不支持原生数组作为参数,你需要把字段类型改为IEnumerable<string>,调整后的缓存扩展代码如下:
public class SOSiteStatusFilterExt : PXCacheExtension<SOSiteStatusFilter> { public static bool IsActive() { return true; } public abstract class searchItemsList : PX.Data.IBqlField { } [PXUnboundDefault()] public virtual IEnumerable<string> SearchItemsList { get; set; } }
编写PXProjection/Select2的BQL条件
在你的查询Where子句中直接使用如下写法即可:Where<InventoryItem.inventoryCD, In<Current<SOSiteStatusFilterExt.searchItemsList>>>运行时动态赋值
在业务逻辑中组装动态列表后给过滤器字段赋值即可触发动态IN查询,示例代码如下:
var filterExt = Base.Filter.Current.GetExtension<SOSiteStatusFilterExt>(); // 可以传入任意长度的字符串列表 filterExt.SearchItemsList = new List<string> { "123123", "154677", "445899", "998766" }; Base.Filter.Update(Base.Filter.Current); // 执行查询刷新即可 Base.View.Query.Select();
注意事项
- 不需要封装PXString对象数组,直接传入字符串的可枚举集合即可,BQL引擎会自动将集合元素转换为SQL IN子句的参数
- 该写法兼容所有BQL查询场景,包括PXSelect、Select2、PXProjection,不需要单独适配Projection场景
- 如果你需要筛选的是数值类型字段,只需要把字段的泛型类型改为对应类型的可枚举集合即可,比如筛选INT类型字段可以用
IEnumerable<int?>
内容的提问来源于stack exchange,提问作者user1576945
相关产品推荐
相关产品推荐

