如何筛选MS Graph查询的Planner任务并正确使用$top参数
问题根因
- 你对
$top参数的作用理解有偏差:这个参数仅用来指定单次接口响应返回的最大条目数,不会自动按创建时间排序,也不会自动做结果截断。另外MS Graph的OData参数严格区分大小写,你写的$Top首字母大写属于无效参数,接口识别不到就会走默认逻辑返回计划下的全部任务,这就是你传了参数没生效的直接原因。 - 额外提一句:Planner任务列表接口目前不支持服务端
$filter筛选,这是接口本身的能力限制,和你写的筛选语法对错没关系,别在这个方向浪费时间试错。
实现步骤
第一步:正确分页拉取全量任务
- 首次请求用正确的小写参数:
这里https://graph.microsoft.com/v1.0/planner/plans/{替换成你的PlanID}/tasks?$top=50$top最大可以设到50,比20的分页大小拉取效率更高。 - 每次拿到接口响应后,检查返回体里有没有
@odata.nextLink字段:如果有,就继续请求这个字段对应的地址,直到某次响应里没有这个字段,就说明已经拿全了该计划下的所有任务。
第二步:本地执行筛选
拿到完整任务列表后,直接在你的代码里按规则过滤即可,两个条件满足任意一条就保留:
- 任务的
createdDateTime字段值大于等于上月1号0点的UTC时间 - 任务的
percentComplete字段值小于100
时间比对注意统一时区:接口返回的
createdDateTime是UTC标准时间,计算上月起始时间的时候也要转成UTC格式再比对,避免时差导致的筛选误差。
补充:如果需要按创建时间排序取最新任务
该接口同样不支持$orderby服务端排序,你可以在拿到任务列表后,本地按createdDateTime字段倒序排列,再截取你需要的前N条结果即可。
避坑提示
- 所有MS Graph的OData查询参数(
$top/$filter/$orderby等)都是$加全小写参数名的格式,首字母大写的写法不会触发参数报错,但会被接口直接忽略,等于没传。 - Planner系列接口的OData参数支持度很低,目前仅支持
$select(指定返回字段)和正确格式的$top(分页),不要套用其他Graph接口的$filter、$search语法,试了也不会生效。
内容的提问来源于stack exchange,提问作者Moseph
相关产品推荐
相关产品推荐

