AsType 和 IsType 函数

适用于:画布应用模型驱动应用 Power Pages Power Platform CLI

检查记录引用是否为特定表类型(IsType),并将引用视为该类型(AsType)。

备注

PAC CLI pac power-fx 命令不支持 IsType

Description

AsTypeIsType 函数可用于将记录引用(例如 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 函数中使用记录引用,而不使用 IsTypeAsType

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'
)

对于这两种功能,请通过与表格连接的数据源名称指定类型。 为了使公式正常工作,您还必须将要测试或转换的任何类型的数据源添加到应用。 例如,如果您想要将 IsTypeAsType负责人查找和该表中的记录一起使用,则必须添加用户表作为数据源。 您只能添加您在应用中实际使用的数据源;您不需要添加查找可以引用的所有表。

如果记录引用为空白IsType 将返回 FALSE,AsType 将返回空白空白记录的所有字段也为空白

非类型化对象

重要提示

在 Power Fx 中使用来自网络 API 或 [ParseJSON 函数] 的非类型化对象之前,需要将其转换为类型化对象。 执行此操作的选项包括:

  1. 在使用字段的位置隐式键入该字段。 例如,如果一个对象可以转换为数字,那么在使用 + 操作符时就会将其转换为数字。 此选项可能会有意外的转换,并且无法将记录和表作为一个整体进行转换。
  2. 使用 DecimalTextDateTimeGUID 及其他类型构造函数分别明确键入每个字段。 这对您的公式最具侵入性,因为每个字段必须单独完成。
  3. 使用 ParseJSON 函数的第二个参数明确键入 JSON。 这是一个简单的选项,可以避免需要非类型化对象。
  4. 使用 AsType 函数明确键入未类型化的对象。 在尝试转换之前,还可以使用 IsType 函数测试类型。

语法

AsType( RecordReference, TableType )

  • RecordReference - 必需。 一个记录引用,通常是一个查找字段,可以引用多个表中任何一个表的记录。
  • TableType - 必需。 记录应该转换到的特定表。

AsType( UntypedObject, TypeSpecification )

  • UntypedObject - 必填。 一个记录引用,通常是一个查找字段,可以引用多个表中任何一个表的记录。
  • TypeSpecification - 必填。 使用 Type 函数定义的类型名称或类型规范。

IsType( RecordReference, TableType )

  • RecordReference - 必需。 一个记录引用,通常是一个查找字段,可以引用多个表中任何一个表的记录。
  • TableType - 必需。 要针对其进行测试的特定表。

IsType( UntypedObject, TypeSpecification )

  • UntypedObject - 必填。 一个记录引用,通常是一个查找字段,可以引用多个表中任何一个表的记录。
  • TypeSpecification - 必填。 使用 Type 函数定义的类型名称或类型规范。

示例

记录引用

了解记录引用和多态查找中包含大量示例。

  1. 创建适用于平板电脑的空白画布应用。

  2. 在左侧窗格上,选择数据>添加数据。 然后,添加客户联系人表。

    具有客户和联系人两个数据源的空白应用。

  3. 在左窗格上,选择 +(插入)>布局>空白垂直库

    插入具有空白垂直布局的 Gallery 控件。

  4. 选择连接到数据,然后选择联系人作为数据源。

  5. 将库的布局设置为标题和副标题

    从属性窗格打开布局选取器。

    将布局设置为“标题和副标题”。

  6. 数据窗格中,打开 Title1 列表,然后选择命名

    设置标题值。

  7. 选择 Subtitle1 Label 控件。

    设置副标题值。

  8. Subtitle1Text 属性设置为以下公式:

    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 中,ParseJSONAsTypeIsType 对简单 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