Axapta AOT查询与X++;select语句

Axapta AOT查询与X++;select语句,axapta,x++,Axapta,X++,在AX编程最佳实践中,哪种方法是最好的: 使用从AOT创建的查询 在X++代码中使用select语句 使用用X++代码创建的查询,查询类 什么时候使用它们中的每一个?首先,AX总是在内部使用查询,X++选择被转换为查询构造调用,这些调用在运行时执行。查询在运行时在第一个queryRun.next()或datasource.executeQuery()上转换为SQL。因此,使用一个或另一个都不会有性能差异 表单也使用查询,通常是为您自动构造的,因为属性AutoQuery有一个“是”默认值。您可

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

  • 使用从AOT创建的查询
  • 在X++代码中使用select语句
  • 使用用X++代码创建的查询,查询类

什么时候使用它们中的每一个?

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

表单也使用查询,通常是为您自动构造的,因为属性
AutoQuery
有一个“是”默认值。您可以在<代码> ExcUTEQueQue/Cuff>方法中使用X++选择,但我会认为这是一个错误的做法,因为用户将没有可用的过滤器或排序选项。始终在表单中使用查询,更喜欢使用自动查询。如果需要,使用
this.queryBuildDatasource()
init
方法中添加范围或排序。例外情况是始终使用AOT查询的listpages

RunBase
中,类更喜欢使用查询,因为用户可以选择更改查询。您可能会在内部循环中使用简单的X++选择,但如果可能的话,可以考虑将其包含在预构建的查询中。 否则,作为程序员,您的主要目标(除了解决问题外)是最小化代码行的数量

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

QueryRun qr = new QueryRun(queryStr(MyQuery))
qr.query().dataSourceTable(tableNum(MyTable)).findRange(fieldNum(MyTable,MyField)).value('myValue');
与:

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

X++还剩下什么

  • 使用小where子句和简单或无连接进行简单选择
  • 当您还不能使用查询时,
    delete\u from
    update\u recordset
    insert\u recordset
    就会浮现在脑海中
  • 避免外部依赖(如AOT查询)有时可能更重要
  • X++查询的代码可读性优于查询构造

在数据库中选择记录的主要技术如下:

  • select语句
  • 质询
这些技术基本上是相同的。它们都以可访问的表变量形式从数据库中传递一组记录

在以下情况下使用select语句:

  • 选择标准很复杂
  • 您正在从X++中选择一组记录。用户不会更改选择标准
在以下情况下使用查询:

  • 用户可以选择要选择的记录
  • 用户可以更改要选择的记录范围
  • 选择条件并不比查询所能容纳的复杂
  • 使用查询时,请在应用程序对象树(AOT)中开发它们,或者在代码中从头开始构建它们。在这两种情况下,都可以在代码中修改查询。可以保存代码中从头开始构建的查询,以便在AOT中进行查询。然而,这通常应该避免
在以下情况下在AOT中生成查询:

  • 许多地方都在使用特定的查询定义。(可以重用AOT中的查询。)
  • 查询必须包含代码
  • 查询定义更复杂。AOT提供查询的可视化表示

回答得很好。当您说X++选择被转换为查询构造调用时,您如何知道这一点?通过查看CIL生成的XML。实际上,它不是调用,而是特定的操作码。示例
bankschecklayout.find
method(第15行):…需要时也应该使用查询。谢谢Jan B.Kjelsen,这是一个非常慷慨的回答。
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);