使用查询类将多个表连接到同一个表

时间:2015-04-20 15:12:55

标签: axapta x++ dynamics-ax-2012 dynamics-ax-2009

我正在使用查询类来构建一个查询,该查询将有两个或三个表连接到同一个表,如下所示:

qbds1 = query.addDataSource(tablenum(Table1));

qbds2 = qbds1.addDataSource(tablenum(Table2));
qbds2.relations(true);

qbds3 = qbds2.addDataSource(tablenum(Table3));
qbds3.relations(true); 

qbds4 = qbds3.addDataSource(tablenum(Table4));
qbds4.relations(true);

qbds5 = qbds3.addDataSource(tablenum(Table5));
qbds5.relations(true);

qbds6 = qbds5.addDataSource(tablenum(Table6));
qbds6.relations(true);
qbds6.joinMode(JoinMode::ExistsJoin);

在此示例中,我尝试将表 4 连接到表 3 ,将表 5 连接到表 3 但它不像我想要的那样工作;我已经使用调试器检查并直到:

qbds5 = qbds3.addDataSource(tablenum(Table5))

外翻是可以的;一旦执行此行,Table4和Table3之间的连接就会消失,并且不会添加Table5和Table3之间的连接。发送到SQL服务器的查询实际上是2个查询,一个在table1,table2和table3之间,另一个在table5和table6之间(table4的链接不存在)。如果我在最后执行info(query.xml()),我会看到所有表之间的连接,就像我想要的那样。

甚至可以使用查询类实现此目的吗?

2 个答案:

答案 0 :(得分:2)

如果连接级别上有多个数据源,则需要将数据源的FetchMode设置为1:1(默认值为1:n)。

在您的情况下,查询树看起来像

Table1
+ Table2
  + Table3
    + Table4
    + Table5
      + Table6

因此Table4Table5位于同一个加入级别,需要FetchMode为1:1。要为数据源设置FetchMode,请使用类似于

的代码行
qbds2.fetchMode(QueryFetchMode::One2One);

有关其他信息,请参阅Magical FetchMode propertySee how the fetch and join modes in Microsoft Dynamics AX queries work

答案 1 :(得分:1)

FH-Inway回答是正确的:只需添加

qbdsX.fetchMode(QueryFetchMode::One2One);

对于同一级别的每个联接。