如何使用Fluent BQL实现PXSelector等效功能以支持子查询?
用Fluent BQL替代PXSelector并包含子查询的实现方式
存在Fluent BQL的等效实现方式,你可以通过PXSelect系列查询构造器结合子查询,实现和PXSelector一致的筛选逻辑,且支持更灵活的嵌套查询。
核心实现方式
Fluent BQL通过Subquery类包裹内层PXSelect查询来实现子查询,再将整个查询传递给PXSelectorAttribute,或者在图形中预定义查询后关联到字段。
示例1:直接在字段属性中使用Fluent BQL子查询
假设需要筛选基础单位与采购单位对应的UOM编码一致的库存项,用Fluent BQL实现PXSelector:
[PXDBInt] [PXSelector( typeof(PXSelect<InventoryItem, Where<InventoryItem.baseUnit, Equal<Subquery< PXSelect<UOM, Where<UOM.uomID, Equal<InventoryItem.purchaseUnit>>, Aggregate<GroupBy<UOM.uomCD>>>>>>), typeof(InventoryItem.inventoryCD), typeof(InventoryItem.descr), DescriptionField = typeof(InventoryItem.descr) )] public virtual int? InventoryID { get; set; }
示例2:图形中预定义查询再关联到选择器
对于复杂逻辑,可将查询抽离到图形中,再通过类型引用绑定到字段:
// 图形中定义包含子查询逻辑的Fluent BQL查询 public PXSelect<InventoryItem, Where<InventoryItem.baseUnit, Equal<Subquery< PXSelect<UOM, Where<UOM.uomID, Equal<InventoryItem.purchaseUnit>>, Aggregate<GroupBy<UOM.uomCD>>>>>>> FilteredInventoryItems; // 字段上引用预定义的查询 [PXDBInt] [PXSelector(typeof(FilteredInventoryItems), typeof(InventoryItem.inventoryCD), typeof(InventoryItem.descr), DescriptionField = typeof(InventoryItem.descr))] public virtual int? InventoryID { get; set; }
关键说明
- Fluent BQL的
Subquery类完全等价于传统BQL的子查询语法,支持嵌套多层查询、聚合函数、多表关联等复杂逻辑。 - 所有PXSelector能实现的筛选规则,都可以用Fluent BQL重构,且代码结构更清晰,便于维护和扩展。
内容的提问来源于stack exchange,提问作者Tony Lanzer
相关产品推荐
相关产品推荐

