如何对来自 PowerQuery 的 OData 中的大型数据集的请求进行分页?

Posted

技术标签:

【中文标题】如何对来自 PowerQuery 的 OData 中的大型数据集的请求进行分页?【英文标题】:How to paginate requests for large data sets in OData from PowerQuery? 【发布时间】:2015-01-07 16:53:19 【问题描述】:

我有一个 OData 提要,其中包含许多大表(数千万行)。我需要配置 PowerQuery(或 PowerPivot,以最适合该工作的工具为准)来访问此 OData 提要,但要以分页方式进行,这样单个请求就不会尝试同时返回 1000 万行,而是使用多个分页查询构建数千万行的完整结果。我不想手动提交许多具有不同 $top 和 $skip 值的不同 URL 来进行我自己的手动分页,而是需要 PowerQuery 或 PowerPivot 来为我处理分页。

我希望 PQ/PP 能够足够聪明地进行分页,也许通过首先发出“计数”查询来确定存在多少行,但情况似乎并非如此。当我给 PQ/PP 一个指向大型 OData 表的 URL 时,它只是盲目地发出一个查询来检索所有行(实际上,它发出 2 个这样的相同查询,这看起来很奇怪),这会使服务器上的数据库崩溃。

在寻找答案时,我看到了 PQ/PP 可以进行分页的提示,但不知道如何启用此行为。那么有没有办法告诉 PQ/PP 使用某种分页来访问大型数据集?如果可以,我可以设置页面大小吗?

【问题讨论】:

我们的假设是服务器会选择最佳的页面大小,所以我们很大程度上让服务器选择分页策略。我相信 Sam 的回答将是在服务器上为 Web API 启用此功能的方法,但对于大多数应用程序,我可能会鼓励您选择大于 10 的页面大小:D。 【参考方案1】:

如果您使用 Web API,您能否将 PageSize 放在 EnableQueryAttribute 上。

[EnableQuery(PageSize = 10)]
public IHttpActionResult Get()

  return Ok(customers);

【讨论】:

【参考方案2】:

您可以使用递归来获取和追加连续页面。每个连续的 fetch 在 url 中使用一个更高的“开始”行号。如果 fetch 产生一个空列表,则递归结束。在“M”中,if 语句可以检查空列表,否则附加并增加“@”以自我引用您当前的函数名称。

【讨论】:

以上是关于如何对来自 PowerQuery 的 OData 中的大型数据集的请求进行分页?的主要内容,如果未能解决你的问题,请参考以下文章

Excel Power Query 重复 OData 请求

针对 .Net Odata Web Api 使用 Excel Power Query 进行身份验证

对 Azure 表使用 Get Entities 操作时,如何删除 odata.etag?

来自运行时数据层的 C# 中的动态 odata 服务

如何使用jMeter对某个OData服务进行高并发性能测试

Kendo UI DataSource - 来自过滤器属性的 OData 查询字符串