了解委派
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 会用蓝色下划线标记该公式。
可委派的数据源
委托功能仅适用于特定的表格数据源。 如果数据源支持委托,其连接器文档会说明该支持。 例如,以下常见的表格数据源支持委托:
- Microsoft Dataverse 的 Power Apps 可委派函数和操作
- SharePoint 的 Power Apps 可委派函数和操作
- SQL Server 的 Power Apps 可委派函数和操作
- Salesforce 的 Power Apps 可委派函数和操作
导入的Excel工作簿(使用向应用程序添加静态数据数据源)、集合和存储在上下文变量中的表格无需委托。 所有这些数据已存在于内存中,因此您可以使用完整的 Power Apps 语言。
委派函数
仅使用可委派的公式。 本文列出了可以委派的公式元素。 每个数据源都不同,并非所有数据源都支持所有这些元素。 在公式中检查委托警告。
Filter 函数
在 Filter 和 LookUp 函数中,使用这些函数与表的列配合使用以选择适当的记录:
- And(包括 &&)、Or(包括 ||)、Not(包括 !)
-
In> [!NOTE]
In is only delegated for columns on the base data source. 例如,如果数据源是客户 表,
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() 不依赖于记录中的任何列,因此它们对所有记录返回相同值。 这些值作为常量发送至数据源,不会阻塞委托。
上述列表未包含以下重要项目。
- If
- *、/、Mod
- 列转换操作 Text、Value
- Concatenate(包括 &)
- ExactIn
- 字符串操作函数:Lower、Upper、Left、Mid、Len...
- 信号:Location、Acceleration、Compass...
- 可变函数:Rand...
- 集合
委托和集合
当您使用 With
、UpdateContext
或 Set
时,它们会内部创建集合。 集合是静态的内存中记录列表,不参与委派。 您看不到委派警告。
查询限制
查找和展开级别
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'
)
排序函数
Sort 和 SortByColumns 可以委派。
在 Sort 中,公式只能是单个列的名称,不能包括其他运算符或函数。
聚合函数
可以根据后端支持委派某些聚合函数。 可以委派 Sum、Average、Min 和 Max 等函数。 计数函数,如 CountRows 和 Count,也可以委托。 但 RemoveIf 和 UpdateIf 有委托限制。 只有有限数量的数据源支持这些函数的委派。 更多信息,请参见委托列表。
不可委派函数
所有其他函数都不能委托,包括这些值得注意的函数:
不可委托的限制
无法委托的公式将本地处理。 本地处理允许您使用完整的 Power Apps 公式语言。 但存在权衡:所有数据必须首先传输到设备,这可能意味着通过网络检索大量数据。 此过程可能需要一些时间,并使您的应用看起来很慢或无响应。
为避免此情况,Power Apps 默认将本地处理的数据量限制为 500 条记录。 此限制允许您完全使用小型数据集,并通过查看部分结果来优化大型数据集的使用。
使用此功能时要小心,因为它会使用户感到困惑。 例如,如果您使用 Filter 函数对包含百万条记录的数据源应用无法委托的筛选公式,仅前500条记录会被扫描。 如果您要查找的记录是第 501 条或第 500,001 条,Filter 不会考虑或返回该记录。
聚合函数也可能令人困惑。 例如,如果您在同一百万条记录的数据源中对某一列使用平均,平均无法被委托,因为该表达式本身无法被委托(参见之前的注意事项)。 仅对前 500 条记录进行平均。 如果您不小心,用户可能会认为部分答案已完成。
更改限制
默认记录数为 500,但您可以为整个应用程序更改此数值:
- 选择设置。
- 在常规下,将数据行限制设置从 1 更改为 2000。
在某些情况下,2,000 条(或 1,000 或 1,500 条)记录对于您的方案来说就足够了。 您可以根据需要增加此数值,但这样做可能会导致应用程序性能下降,尤其是在处理列数较多的宽表时。 最好还是尽可能多地委派。
为了确保应用程序能够处理大型数据集,请将此值设置为 1。 无法委托的任何内容都会返回单个记录,这在测试应用程序时容易被检测到。 这有助于您在将概念验证应用程序迁移到生产环境时避免意外情况。
委派警告
Power Apps 在创建无法委托的公式时显示警告(黄色三角形)。 这样可以更轻松地了解什么是委派的,什么是不委派的。
委托警告仅在使用可委托数据源的公式中显示。 如果您未看到警告但认为公式未被委托,请将数据源类型与本文之前部分列出的可委托数据源列表进行对比。
示例
在此示例中,您基于名为 [dbo].[Fruit] 的 SQL Server 表自动生成一个三屏应用程序。 要了解如何生成应用程序,可将关于 Dataverse 的文章中的类似原则应用于 SQL Server。
库的项目属性使用包含 SortByColumns 和 Search 函数的公式,这两个函数均可委托。
在搜索框中输入 Apple。
在应用程序与 SQL Server 通信以处理搜索请求时,屏幕顶部会短暂显示行进的点。 所有符合搜索条件的记录都会显示,即使数据源中有数百万条记录。
搜索结果包括“Apples”和“Pineapple”,因为 Search 函数会查找文本列中的所有位置。 要查找仅包含搜索词作为水果名称开头的记录,请使用另一个可委托函数 Filter,并使用更具体的搜索词。 为了简化操作,请移除 SortByColumns 调用。
新的结果包括“Apples”,而不包括“Pineapple”。 如果左侧导航栏显示缩略图,则在库旁边和屏幕缩略图中会显示一个黄色三角形。 公式的一部分下方会显示一条蓝色的波浪线。 其中每个元素都表示一条警告。 当您将鼠标悬停在画廊旁边的黄色三角形上时,会显示以下消息:
SQL Server 是可委托的数据源,而 Filter 是可委托的函数。 然而,Mid 和 Len 无法委托给任何数据源。
但它有效,不是吗? 某种程度上是这样。 这就是为什么这是一个警告,而不是红色波浪线。
- 如果表中的记录少于 500 条,公式会完美运行。 所有记录都会被加载到设备上,并且 Filter 会在本地应用。
- 如果表中的记录数超过 500 条,公式不会返回第 501 条及以后的记录,即使这些记录符合条件。