我目前正在使用Microsoft Graph与Planner进行交互,以便创建包含特定信息的任务。我正在使用Angular和WebApi 2 / ASP.NET 5解决方案。
现在,当我尝试合并我在计划程序计划中对数据库中的每个计划的任务数量时,检索到的信息需要太多时间才能返回到我的webapi控制器(将近39秒的时间来检索205个计划,并计算他们的任务)。还必须添加我使用外部库(Polly Library)实现的重试尝试策略
对于我在数据库中的每个计划,我都会使用Microsoft Graph API来检索它拥有的所有任务。如果我不使用重试政策,在许多机会中,我从许多计划中失去了一些任务,我不知道为什么。
public async Task<int> GetTasksCountInPlan(GraphServiceClient graphClient, string planId)
{
var errors = new Dictionary<string, string>();
try
{
var retryPolicy = Policy
.Handle<ServiceException>()
.Or<Exception>()
.WaitAndRetryAsync(2, retryAttempt => TimeSpan.FromMilliseconds(10));
var task = await retryPolicy.ExecuteAsync(() =>
graphClient.Planner
.Plans[planId]
.Tasks
.Request()
.GetAsync());
return task?.Count ?? 0;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Task Count Error for PlanId: {planId} Etag:{ex.Message}");
errors.Add(planId, ex.Message);
return 0;
}
}
上面描述的代码是针对我在DB中的每个计划进行迭代的。
是否有可能访问每个计划的这些任务以获取计数而不是所有描述,还有一种方法可以使用大量计划检索我需要的信息而不是迭代每个计划吗?
答案 0 :(得分:1)
您可以通过传递Count query parameter(task
)来获取$count=true
个项目的数量。这将作为Request()
传递给List<QueryOption>
方法:
var queryOptions = new List<QueryOption>() { new QueryOption("$count", "true") };
var tasks = await retryPolicy.ExecuteAsync(() =>
graphClient.Planner
.Plans[planId]
.Tasks
.Request()
.GetAsync());
return tasks.AdditionalData["@odata.count"]