AsType 和 IsType 函数
适用于:画布应用模型驱动应用 Power Pages Power Platform CLI
检查记录引用是否为特定表类型(IsType),并将引用视为该类型(AsType)。
备注
PAC CLI pac power-fx 命令不支持 IsType。
Description
AsType 和 IsType 函数可用于将记录引用(例如 Dataverse 中的多态查找)和未键入对象转换为可直接使用的键入对象。
记录引用
阅读了解记录引用和多态查找,了解更广泛的介绍和更多详细信息。
查找字段通常指特定表中的记录。 由于表格类型已经确定,因此可以使用简单的点符号访问查找的字段。 例如,First( Accounts ).'Primary Contact'.'Full Name' 从客户表到达联系人表中的主要联系人记录,提取全名字段。
Microsoft Dataverse 还支持多态查找字段,它可以引用一组表中的记录,如这些示例中所示。
查找字段 | 可以引用 |
---|---|
所有者 | 用户或团队 |
客户 | 客户或联系人 |
关于 | 客户、联系人、知识文章等。 |
在区域应用公式中,使用记录引用处理多态查找。 由于记录引用可以引用不同的表,因此在编写公式时,不清楚哪些字段在运行时可用。 不能使用 Record.Field 表示法。 这些公式必须适应应用运行时遇到的记录。
IsType 函数用于测试记录引用是否指向特定的表类型。 函数返回布尔值 TRUE 或 FALSE。
AsType 函数将记录引用视为特定的表类型,也称为转换。 使用结果时您可以将它当作表的记录那样使用,然后再次使用 Record.Field 表示法访问该记录的所有字段。 如果引用不是特定类型,将发生错误。
首选将这些函数一起用来测试记录的表类型,然后将其视为该类型的记录,让字段可用:
If( IsType( First( Accounts ).Owner, Users ),
AsType( First( Accounts ).Owner, Users ).'Full Name',
AsType( First( Accounts ).Owner, Teams ).'Team Name'
)
只有在访问记录引用的字段时,才需要使用这些函数。 例如,您可以在 Filter 函数中使用记录引用,而不使用 IsType 或 AsType:
Filter( Accounts, Owner = First( Users ) )
同样,可以将记录引用与 Patch 函数一起使用:
Patch( Accounts, First( Accounts ), { Owner: First( Teams ) } )
在记录上下文中使用时,例如在库或编辑表单控件中使用时,可能需要使用全局消除歧义运算符来引用表类型。 例如,此公式对显示公司名称是客户查找的联系人列表的库有效:
If( IsType( ThisItem.'Company Name', Accounts ),
AsType( ThisItem.'Company Name', Accounts ).'Account Name',
AsType( ThisItem.'Company Name', Contacts ).'Full Name'
)
对于这两种功能,请通过与表格连接的数据源名称指定类型。 为了使公式正常工作,您还必须将要测试或转换的任何类型的数据源添加到应用。 例如,如果您想要将 IsType 和 AsType 与负责人查找和该表中的记录一起使用,则必须添加用户表作为数据源。 您只能添加您在应用中实际使用的数据源;您不需要添加查找可以引用的所有表。
如果记录引用为空白,IsType 将返回 FALSE,AsType 将返回空白。 空白记录的所有字段也为空白。
非类型化对象
重要提示
- 对非类型化对象使用 AsType 和 IsType 是一项试验性功能。
- 试验功能不适合生产使用,而且可能不完整。 这些功能在正式发布之前已经可用,以便您可以及早使用并提供反馈。 详细信息:了解画布应用中的试验、预览和停用功能
- 本文介绍的行为仅在用户定义类型试验功能在设置 > 即将推出的功能 > 试验打开(默认关闭)时可用。
- 您的反馈对我们很重要。 请在 Power Apps 试验功能社区论坛中告诉我们您的想法。
在 Power Fx 中使用来自网络 API 或 [ParseJSON 函数] 的非类型化对象之前,需要将其转换为类型化对象。 执行此操作的选项包括:
- 在使用字段的位置隐式键入该字段。 例如,如果一个对象可以转换为数字,那么在使用
+
操作符时就会将其转换为数字。 此选项可能会有意外的转换,并且无法将记录和表作为一个整体进行转换。 - 使用 Decimal、Text、DateTime、GUID 及其他类型构造函数分别明确键入每个字段。 这对您的公式最具侵入性,因为每个字段必须单独完成。
- 使用 ParseJSON 函数的第二个参数明确键入 JSON。 这是一个简单的选项,可以避免需要非类型化对象。
- 使用 AsType 函数明确键入未类型化的对象。 在尝试转换之前,还可以使用 IsType 函数测试类型。
语法
AsType( RecordReference, TableType )
- RecordReference - 必需。 一个记录引用,通常是一个查找字段,可以引用多个表中任何一个表的记录。
- TableType - 必需。 记录应该转换到的特定表。
AsType( UntypedObject, TypeSpecification )
- UntypedObject - 必填。 一个记录引用,通常是一个查找字段,可以引用多个表中任何一个表的记录。
- TypeSpecification - 必填。 使用 Type 函数定义的类型名称或类型规范。
IsType( RecordReference, TableType )
- RecordReference - 必需。 一个记录引用,通常是一个查找字段,可以引用多个表中任何一个表的记录。
- TableType - 必需。 要针对其进行测试的特定表。
IsType( UntypedObject, TypeSpecification )
- UntypedObject - 必填。 一个记录引用,通常是一个查找字段,可以引用多个表中任何一个表的记录。
- TypeSpecification - 必填。 使用 Type 函数定义的类型名称或类型规范。
示例
记录引用
了解记录引用和多态查找中包含大量示例。
创建适用于平板电脑的空白画布应用。
在左侧窗格上,选择数据>添加数据。 然后,添加客户和联系人表。
在左窗格上,选择 +(插入)>布局>空白垂直库。
选择连接到数据,然后选择联系人作为数据源。
将库的布局设置为标题和副标题。
在数据窗格中,打开 Title1 列表,然后选择命名。
选择 Subtitle1 Label 控件。
将 Subtitle1 的 Text 属性设置为以下公式:
If( IsBlank( ThisItem.'Company Name' ), "--", IsType( ThisItem.'Company Name', Accounts ), "Account: " & AsType( ThisItem.'Company Name', Accounts ).'Account Name', "Contact: " & AsType( ThisItem.'Company Name', Contacts ).'Full Name' )
库中的副标题显示以下值:
- 如果 'Company Name' 为空白,则为 "--"。
- 如果公司名称字段表示的是一个客户,则为“客户:”,然后是客户表中的客户名称字段。
- 如果公司名称字段表示的是一个联系人,则为“联系人:”,然后是联系人表中的全名字段。
您的结果可能会有所不同,因为示例数据可能已被修改以显示更多类型的结果。
非类型化对象
下面的示例展示了在 Pac CLI Power Fx REPL 中,ParseJSON、AsType 和 IsType 对简单 JSON 记录的各种解释。
在第一个示例中,ParseJSON 没有提供类型信息,因此返回的是一个无类型的对象。
>> Set( rec, ParseJSON( "{""a"":1}" ) )
rec: <Untyped: Use Value, Text, Boolean, or other functions to establish the type>
在数字上下文中使用时,该字段会隐式转换为数字。
>> 1 + rec.a
2
作为另一种选择,本例通过 ParseJSON 的第二个参数显式地将记录转换为类型化的 Power Fx 记录。
>> ParseJSON( "{""a"":1}", Type( {a: Number} ) )
{a:1}
另外,本例使用 AsType 明确地将记录转换为类型化的 Power Fx 记录。
>> AsType( ParseJSON( "{""a"":1}" ), Type( {a: Number} ) )
{a:1}
最后,如果我们还不确定,本示例会在使用 IsType 函数转换之前测试类型。
>> IsType( ParseJSON( "{""a"":1}" ), Type( {a: Number} ) )
true