C# 从计划中检索任务计数

C# 从计划中检索任务计数,c#,microsoft-graph-api,C#,Microsoft Graph Api,我目前正在使用Microsoft Graph与Planner进行交互,以便使用特定信息创建任务。我正在使用Angular和WebApi 2/ASP.NET 5解决方案 现在,当我试图将数据库中的每个计划的任务数量与Planner的计划中的任务数量进行合并时,检索到的信息需要花费太多时间才能返回到我的webapi控制器(检索205个计划及其任务数几乎需要39秒)。还必须添加我正在使用外部库()实现的重试尝试策略 对于数据库中的每个计划,我将使用MicrosoftGraphAPI检索它拥有的所有任务

我目前正在使用Microsoft Graph与Planner进行交互,以便使用特定信息创建任务。我正在使用Angular和WebApi 2/ASP.NET 5解决方案

现在,当我试图将数据库中的每个计划的任务数量与Planner的计划中的任务数量进行合并时,检索到的信息需要花费太多时间才能返回到我的webapi控制器(检索205个计划及其任务数几乎需要39秒)。还必须添加我正在使用外部库()实现的重试尝试策略

对于数据库中的每个计划,我将使用MicrosoftGraphAPI检索它拥有的所有任务。如果我不使用重试策略,在许多情况下,我会从许多计划中丢失一些任务,我不知道为什么

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;
    }
}
public异步任务GetTasksCountInPlan(GraphServiceClient graphClient,string planId)
{
var errors=newdictionary();
尝试
{
var retryPolicy=Policy
.Handle()
.或()
.WaitAndRetryAsync(2,retrytry=>TimeSpan.Fromms(10));
var task=wait retryPolicy.ExecuteAsync(()=>
图形客户端。计划器
.平面图[平面图]
.任务
.Request()
.GetAsync());
返回任务?计数?0;
}
捕获(例外情况除外)
{
System.Diagnostics.Debug.WriteLine($“PlanId:{PlanId}Etag:{ex.Message}的任务计数错误”);
错误。添加(planId,例如消息);
返回0;
}
}
我上面描述的代码针对我在数据库中的每个计划进行迭代


是否有可能访问每个计划的这些任务,以获得计数而不是所有描述,是否有方法使用大量计划而不是迭代每个计划来检索我需要的信息?

通过传递(
$count=true
)可以获得
任务
项的数量。这将作为
列表传递给
请求()
方法:

var queryOptions=new List(){new QueryOption(“$count”,“true”)};
var tasks=wait retryPolicy.ExecuteAsync(()=>
图形客户端。计划器
.平面图[平面图]
.任务
.Request()
.GetAsync());
返回任务.AdditionalData[“@odata.count”]

谢谢,Marc,效果很好。我已将检索整个任务组的处理时间缩短了约20秒。可以使用一个api调用使用大量计划来检索我需要的信息,而不是迭代每个计划?,以减少响应时间。是的,您可以使用批处理机制一次最多发送20个请求。
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"]