Acumatica Fluent BQL选择挂起

Acumatica Fluent BQL选择挂起,acumatica,Acumatica,在自定义中,我已覆盖SO行库存ID行更新事件的行为,以便针对特定条件将备用ID设置为不同的值。为此,我创建了一个新的属性类,该类继承自AlternativeItemAttribute,并将新类用于AlternateID。新的属性类将重写RowUpdate方法以执行此操作 在重写的方法中,我使用fluentbql执行了一些查询,但它们似乎挂起了。例如: InventoryItemMaint itemGraph = PXGraph.CreateInstance<InventoryItemMai

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

在重写的方法中,我使用fluentbql执行了一些查询,但它们似乎挂起了。例如:

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

InventoryItem item = itemGraph.Item.Select<InventoryItem>()
    .Where(i => i.InventoryID == newRow.InventoryID)
    .FirstOrDefault();
InventoryItemMaint itemGraph=PXGraph.CreateInstance();
InventoryItem=itemGraph.item.Select()
.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);
InventoryItem项目=新建PXSelectReadonly(itemGraph)
.SelectSingle(newRow.InventoryID);

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

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

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

InventoryItem item = SelectFrom<InventoryItem>
    .Where<InventoryItem.inventoryID.IsEqual<@P.AsInt>>
    .View.Select(itemGraph, newRow.InventoryID);
InventoryItem=SelectFrom
哪里
.View.Select(itemGraph,newRow.InventoryID);
如上所述,FBQL中的itemGraph可以仅替换为该图(如果是图扩展,则替换为Base),并删除另一个图的CreateInstance,除非您确实需要该图用于其他代码


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

您是否尝试过使用Acumatica请求探查器或SQL探查器来查看发生了什么?这是一个相对简单的选择,不应该这样挂起。啊,是的,我想我在实体框架中将Linq与Linq to Sql混淆了,并且假设条件将添加到db查询中,而不是结果。我不是Linq的新手,但我是BQL版本的新手。我试试你的建议。