Generate函数返回的是一张笛卡尔积表,其语法如下:
Generate(table1, table2)
Generate函数迭代table1表格,在table2表格中寻找与之对应的记录并生成笛卡尔积。
这里有2张很简单的表,之间并没有建立任何关系:

T = GENERATE('YiLuXiangBei Stu Course', 'YiLuXiangBei Stu Student')
该函数生成了一张笛卡尔积表,对于Course表中的每一行都乘上了Stu表中的所有行,如下图

当我们在Stu表中加入一列,使这两张表建立连接:

使同样的代码,生成的结果,保持不变,如下:
T = GENERATE('YiLuXiangBei Stu Course', 'YiLuXiangBei Stu Student')

但是,我们对上述代码稍作改动,结果大不相同:
T2 = GENERATE('YiLuXiangBei Stu Course', CALCULATETABLE('YiLuXiangBei Stu Student'))

此时,对于每个科目都返回了与之对应的学生信息,张三同学学习了科目2数学,Generate函数在Course表生成了行上下文,而CalCulateTable函数将行上下文转换成筛选上下文,Course表中的每一行都不再和Stu的所有行进行相乘,而仅仅与对应行进行相乘了。
注:
1. Generate函数中的两张表中不能有相同的列名,不然的话会产生错误

2. 当在Generate函数中发生上下文转换时,当Table1中某些记录在table2中找不到时,会省略记录,如最后一个例子,科目表有化学的信息,但是没有学生学习,所以在结果中不存在化学的信息
参考:
1. https://docs.microsoft.com/en-us/dax/generate-function-dax
2. https://www.powerbigeek.com/understanding-generate-and-generateall/




