使用AOT查询和X ++ select语句有什么区别

raw*_*dha 4 x++ axapta

在AX编程最佳实践中,这是最好的方法:

  • 使用从AOT创建的查询,
  • 使用带有X ++代码的select语句,
  • 使用用X ++代码创建的查询Query classe ...

何时使用它们中的每一个?

Jan*_*sen 10

首先,AX始终在内部使用查询,X ++选择被转换为查询构造调用,这些调用在运行时执行.查询在运行时转换为SQL,queryRun.next()或者在第一个或datasource.executeQuery().因此使用一个或另一个没有性能差异.

表单也使用查询,通常它是为您自动构造的,因为属性AutoQuery具有Yes默认值.您可以executeQuery方法中使用X ++ select ,但我会考虑这种不好的做法,因为用户没有可用的过滤器或排序选项.始终在表单中使用查询,更喜欢使用自动查询.如果需要,init使用方法添加范围或排序this.queryBuildDatasource().唯一的例外是总是使用AOT查询的listpages.

RunBase类中更喜欢使用查询,因为用户可以选择更改查询.您可能会在内部循环中使用简单的X ++ select,但如果可能,请考虑将其包含在预构建的查询中.

否则,作为程序员的主要目标(除了解决问题之外)是最小化代码行数.

在AOT中定义的查询从零代码行开始,这些代码行对它们有利.因此,如果存在多个静态定义的范围,链接或复杂连接,请使用AOT查询.你无法击败:

QueryRun qr = new QueryRun(queryStr(MyQuery))
qr.query().dataSourceTable(tableNum(MyTable)).findRange(fieldNum(MyTable,MyField)).value('myValue');
Run Code Online (Sandbox Code Playgroud)

附:

Query q = new Query();
QueryRun qr = new QueryRun(q);
QueryBuildDataSource ds = q.addDataSource(tableNum(MyTable));
QueryBuildRange qbr = ds.addRange(fieldNum(MyTable,MyField));
qbr.value('myValue');
qbr.locked(true);
Run Code Online (Sandbox Code Playgroud)

因此,在静态情况下,更喜欢使用AOT查询,然后在需要时在运行时更改查询.另一方面,如果您的表仅在运行时已知,则不能使用AOT查询,也不能选择X ++,并且您需要在运行时构建查询.表浏览器就是一个很好的例子.

什么是X ++?

  • 简单选择小where子句和简单连接或无连接.
  • 您不能使用查询的情况delete_from,update_recordset并且insert_recordset会想到.
  • 避免外部依赖(如AOT查询)有时可能更重要.
  • X ++查询的代码可读性优于查询构造.

  • 通过查看CIL生成的XML.实际上它不是通话,而是特定的操作码.示例`BankCheckLayout.find`方法(第15行):<Var offset ='184'index ='3'defaultParamOffset ='0'/> <Find offset ='187'dataset ='9'/> <FirstOnly offset =' 192'/> <其中offset ='193'/> <Var offset ='194'index ='0'defaultParamOffset ='0'/> <Expr offset ='197'> <SymWhere offset ='198'opcode =' 18'> ...... (2认同)