【问题标题】:Acumatica Fluent BQL selects hangAcumatica Fluent BQL 选择挂起
【发布时间】:2020-09-12 21:05:36
【问题描述】:

在自定义中,我已经覆盖了 SO Line 库存 ID RowUpdating 事件的行为,以便为特定条件将备用 ID 设置为不同的值。为此,我创建了一个继承自 AlternativeItemAttribute 的新属性类,并将新类用于 AlternateID。新的属性类会覆盖 RowUpdating 方法来执行此操作。

在被覆盖的方法中,我使用 Fluent BQL 执行了一些查询,但它们似乎只是挂起。示例:

InventoryItemMaint itemGraph = PXGraph.CreateInstance<InventoryItemMaint>();

InventoryItem item = itemGraph.Item.Select<InventoryItem>()
    .Where(i => i.InventoryID == newRow.InventoryID)
    .FirstOrDefault();

我最终用常规 BQL 替换它来解决它(见下文),但我宁愿使用 F-BQL,而且我想知道我是否做错了什么。

InventoryItem item = new PXSelectReadonly<InventoryItem,
    Where<InventoryItem.inventoryID, Equal<Required<InventoryItem.inventoryID>>>>(itemGraph)
    .SelectSingle(newRow.InventoryID);

【问题讨论】:

  • 您是否尝试过使用 Acumatica 请求分析器或 SQL 分析器来查看发生了什么?这是一个相对简单的选择,不应该那样挂。

标签: acumatica


【解决方案1】:

提供的代码只是用于从 InventoryItemMaint 图的 Item 视图中检索数据的 BQL。它的花哨部分是 LINQ。就个人而言,我倾向于使用 Search 来查找主视图的记录,并使用 Select 来检索子视图的数据。第二个示例代码是使用 BQL 直接选择记录而不使用视图。根据您正在执行的操作,您实际上可以使用 thisBase 作为图表名称从当前(或基本)图表中进行选择。不需要为了检索记录而初始化不同的图,除非该图有一些逻辑来填充 DAC 的字段,这在创建记录时并不常见。

我相信您在第一个示例中的 Select 从字面上要求数据库检索所有项目,然后使用 LINQ 将结果缩小到单个项目。这可能是“挂起”的原因。

这是一个 FBQL 示例,用于复制您的第二个示例,该示例专门要求数据库仅提供指定的项目。

InventoryItem item = SelectFrom<InventoryItem>
    .Where<InventoryItem.inventoryID.IsEqual<@P.AsInt>>
    .View.Select(itemGraph, newRow.InventoryID);

如上所述,FBQL 中的 itemGraph 可以仅替换为 this(或 Base,如果是图形扩展)并删除另一个图形的 CreateInstance,除非您真的其他代码需要该图。

如果您是 FBQL 新手,请注意,您可能需要为 PX.Data.BQL.Fluent 添加一个对项目的新引用,并且还需要包含在 using 语句中。

【讨论】:

  • 啊,是的,我想我在实体框架中将 Linq 与 Linq-to-Sql 混淆了,并假设条件将被添加到 db 查询而不是结果中。我对 Linq 并不陌生,但对 BQL 版本很陌生。我会试试你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多