查询限制:委派和查询限制

Power Apps 与后端数据源配合使用时效果最佳,当 Power Fx 查询可完全转换为在数据源上运行的等效查询时。 Power Apps 向数据源发送其能理解的查询,数据源执行该查询,Power Apps 获取结果。 例如,数据源筛选数据,仅返回满足筛选条件的行。 发生这种情况时,查询 被委托 给数据源。

但 Power Fx 查询并非总能转换为所有数据源上的等效查询。 例如,Dataverse 支持的查询功能比 Excel 更多。 Dataverse 支持“in”(成员身份)查询运算符,而 Excel 不支持。 如果查询使用数据源不支持的功能,则查询 不可执行 。 如果查询表达式的任何部分为不可委托,Power Apps 不会委托查询的任何部分。

当查询不可委托时,Power Apps 会从数据源获取前 500 条记录,然后执行查询中的操作。 您可以将此限制增加到 2,000 条记录。 更改限制Power Apps 将结果集大小限制为 500 条记录,以确保应用程序性能良好。较大的结果集可能会导致应用程序和 Power Apps 性能问题。

但是,此限制可能是一个问题,因为如果数据源具有超过 500 或 2,000 条记录,则查询可能会返回不正确的结果。 例如,如果您的数据源包含 1000 万条记录,而您的查询需要处理数据的最后部分(如以 'Z' 开头的姓氏),且查询使用了不可委托的操作符(如 DISTINCT),您只能获取前 500 条或 2000 条记录。 因此,你会得到错误的结果。

针对您的数据源使用可委派表创建 Power Fx 查询。 仅使用可委派的查询函数。 这是使应用保持良好运行的唯一方式,并确保用户获取所需的全部信息。

注意显示无法委托位置的委托警告。 如果使用小型数据集(少于 500 条记录),则可以使用任何数据源和公式,因为如果未委托公式,则应用在本地处理数据。

备注

委托警告帮助您管理应用程序,使其返回正确结果。 如果数据源中的数据超过 500 条记录且函数未委托,Power Fx 会用蓝色下划线标记公式。

可委派的数据源

委派功能仅适用于某些特定的表格数据源。 如果数据源支持委托,其连接器文档会说明该支持。 这些常用的表格数据源支持委派:

导入的Excel工作簿(使用向应用程序添加静态数据数据源)、集合和存储在上下文变量中的表格无需委托。 此数据已在内存中,因此使用完整的 Power Apps 语言。

委派函数

仅使用可委派的公式。 本文列出了可以委派的公式元素。 每个数据源都不同,并非所有数据源都支持所有这些元素。 在公式中检查委托警告。

Filter 函数

过滤搜索首选查找可以进行委托。

FilterLookUp 函数中,使用这些函数与表的列配合使用以选择适当的记录:

  • And(包括 &&)、Or(包括 ||)、Not(包括 !
  • > [!注意]

    In 仅委托用于基础数据源中的列。 例如,如果数据源是客户 表,Filter(Accounts, Name in ["name1", "name2"]) 会委托给数据源进行评估。 但 Filter(Accounts, PrimaryContact.Fullname in ["name1", "name2"]) 不会被委托,因为完整姓名列位于不同的表 (PrimaryContact) 中,而非客户。 表达式在本地计算。

  • =, <>, >=, <=, >, <
  • +, -
  • TrimEnds
  • IsBlank
  • StartsWith, EndsWith
  • 在所有记录(如控件属性、 全局变量和上下文变量)中相同的常量值。

您还可以使用公式中对所有记录都评估为常量值的部分。 例如,Left( Language(), 2 )Date( 2019, 3, 31 )Today() 不依赖于记录中的任何列,因此它们对所有记录返回相同值。 这些值作为常量发送至数据源,不会阻塞委托。

上一个列表不包括以下值得注意的项目:

委托和集合

在使用WithUpdateContextSet时,这些函数会在内部创建集合。 集合是存储在内存中的静态记录列表,无法参与委派操作。 您看不到委派警告。

查询限制

查找和展开级别

Power Apps 允许您使用最多两个查找级别。 一个 Power Fx 查询表达式最多可以包含两个查找函数以保持性能。 当查询表达式包含查找时,Power Apps 首先查询基础表,然后运行第二个查询以使用查找信息扩展第一个表。 支持在此级别之外再增加一个级别作为最大级别。 对于离线场景,仅支持一级查找扩展。

在单个查询中扩展或联接最多 20 个实体。 如果需要在一次查询中联接 20 个以上的表,请尽可能尝试在数据服务器上创建视图。

表达式计算 - 实体的属性必须位于等式运算符的左侧“LHS”

将要比较的实体的属性放在方程的左侧(LHS)。 例如,在以下表达式中,实体属性 'Business unit ID'.Name 位于左侧,且该表达式有效:

Filter(
        Budgets,
        'Business unit ID'.Name = LookUp(
            Users,
            'Primary Email' = User().Email,
            'Business Unit'
        ).Name,
        DataCardValue37.Selected.'Date Range String'='Date Range String'
    )

但是,此表达式不起作用:

 Filter(
        Budgets,
        LookUp(
            Users,
            'Primary Email' = User().Email,
            'Business Unit'
        ).Name = 'Business unit ID'.Name,
        'Date Range String'=DataCardValue37.Selected.'Date Range String'
    )

排序函数

SortSortByColumns 可以委派。

Sort 中,公式只能是单个列的名称,不能包括其他运算符或函数。

聚合函数

可以根据后端支持委派某些聚合函数。 可以委派 SumAverageMinMax 等函数。 计数函数,如 CountRowsCount,也可以委托。 但是, RemoveIfUpdateIf 具有委派限制。 只有有限数量的数据源支持这些函数的委派。 更多信息,请参见委托列表

不可委派函数

所有其他函数都无法委托。 值得注意的函数包括:

不可委托的限制

无法委托的公式将本地处理。 本地处理允许您使用完整的 Power Apps 公式语言。 但是这存在一个折衷:所有数据首先发送到设备,这可能意味着需要通过网络传输大量数据。 此过程可能需要一些时间,并使您的应用看起来很慢或无响应。

为避免此情况,Power Apps 默认将本地处理的数据量限制为 500 条记录。 此限制使你可以完全使用小型数据集,并通过查看部分结果来处理大型数据集。

使用此功能时要小心,因为它会使用户感到困惑。 例如,如果您使用 Filter 函数对包含百万条记录的数据源应用无法委托的筛选公式,仅前500条记录会被扫描。 如果所需的记录是记录 501 或 500,001, 则筛选器 找不到或返回它。

聚合函数也可能令人困惑。 例如,如果您在同一百万条记录的数据源中对某一列使用平均平均无法被委托,因为该表达式本身无法被委托(参见之前的注意事项)。 仅对前 500 条记录进行平均。 如果你不小心,用户可能会认为部分答案是完整的答案。

更改限制

默认记录数为 500,但你可以更改应用的此编号:

  1. 选择设置
  2. 常规下,将数据行限制设置从 1 更改为 2000。

在某些情况下,2,000、1,000 或 1,500 条记录足以满足你的方案。 您可以根据需要增加此数值,但这样做可能会导致应用程序性能下降,尤其是在处理列数较多的宽表时。 最好还是尽可能多地委派。

若要确保应用缩放为大型数据集,请将此值设置为 1。 无法委托的任何内容都会返回单个记录,这在测试应用程序时容易被检测到。 这有助于您在将概念验证应用程序迁移到生产环境时避免意外情况。

委派警告

Power Apps 在创建无法委托的公式时显示警告(黄色三角形)。 更容易知道什么是委派的,什么不是。

委派警告仅在使用可委派数据源的公式上显示。 如果您未看到警告但认为公式未被委托,请将数据源类型与本文之前部分列出的可委托数据源列表进行对比。

示例

在此示例中,您基于名为 [dbo].[Fruit] 的 SQL Server 表自动生成一个三屏应用程序。 要了解如何生成应用程序,可将关于 Dataverse 的文章中的类似原则应用于 SQL Server。

三屏应用。

库的项目属性使用包含 SortByColumnsSearch 函数的公式,这两个函数均可委托。

在搜索框中输入 Apple

在应用程序与 SQL Server 通信以处理搜索请求时,屏幕顶部会短暂显示行进的点。 所有符合搜索条件的记录都会显示,即使数据源中有数百万条记录。

搜索文本输入控件。

搜索结果包括“Apples”“Pineapple”,因为 Search 函数会查找文本列中的所有位置。 要查找仅包含搜索词作为水果名称开头的记录,请使用另一个可委托函数 Filter,并使用更具体的搜索词。 为了简化操作,请移除 SortByColumns 调用。

删除 SortByColumns 调用。

新的结果包括“Apples”,而不包括“Pineapple”。 如果左侧导航栏显示缩略图,则在库旁边和屏幕缩略图中会显示一个黄色三角形。 公式的一部分下方会显示一条蓝色的波浪线。 其中每个元素都表示一条警告。 当您将鼠标悬停在画廊旁边的黄色三角形上时,会显示以下消息:

将光标悬停在委派警告上。

SQL Server 是可委托的数据源,而 Filter 是可委托的函数。 然而,MidLen 无法委托给任何数据源。

但它有效,不是吗? 某种程度上是这样。 这就是为什么这是一个警告,而不是红色波浪线。

  • 如果表中的记录少于 500 条,公式会完美运行。 所有记录都会被加载到设备上,并且 Filter 会在本地应用。
  • 如果表中的记录数超过 500 条,公式不会返回第 501 条及以后的记录,即使这些记录符合条件。

另请参阅