首页 > 解决方案 > 合并来自 SubOrchestrator 函数的输出

问题描述

我有一个持久函数,它读取 AzureAD 组的列表并从每个组中获取用户。这是代码:

编排器:

        public async Task RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
        {
            var groups = await context.CallActivityAsync<List<AzureADGroup>>("GroupsReaderFunction"), null);
            if (groups != null && groups.Count > 0)
            {
                var processingTasks = new List<Task>();
                foreach (var group in groups)
                {
                    var processTask = context.CallSubOrchestratorAsync<List<AzureADUser>>("SubOrchestratorFunction", group });
                    processingTasks.Add(processTask);
                }
                await Task.WhenAll(processingTasks);                
            }
         }

子协调员:

        public async Task<List<AzureADUser>> RunSubOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
        {            
            var request = context.GetInput<AzureADGroup>();
            var users = await context.CallActivityAsync<List<AzureADUser>>("UsersReaderFunction", request.objectId);
            return users;
         }

我需要将所有组中的所有用户放到一个列表中 + 删除重复的用户(如果有的话 - 因为某些用户可能存在于多个组中)并以所有用户作为输入运行一些活动功能。我该怎么做?请告诉我。

试用 Answers 中的代码时出错:

在此处输入图像描述

标签: c#microsoft-graph-apiazure-durable-functions

解决方案


您的子协调员应该返回List<AzureADUser>

        public async Task<List<AzureADUser>> RunSubOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
        {            
            var request = context.GetInput<Group>();
            var users = await context.CallActivityAsync<List<AzureADUser>>("UsersReaderFunction", request.objectId);
            return users;
         }

然后您的协调器可以接收输出并将列表与

        public async Task RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
        {
            var groups = await context.CallActivityAsync<List<AzureADGroup>>("GroupsReaderFunction"), null);
            if (groups != null && groups.Count > 0)
            {
                 var processingTasks = new List<Task<List<AzureADUser>>>();
                foreach (var group in groups)
                {
                    var processTask = context.CallSubOrchestratorAsync<List<AzureADUser>>("SubOrchestratorFunction", group);
                    processingTasks.Add(processTask);
                }
                await Task.WhenAll(processingTasks);
                var users = new List<AzureADUser>();
                foreach (var task in processingTasks)
                {
                    users.AddRange(await task);
                }
            }
         }

我不熟悉 AzureADUser,但如果你有一个 id 或电子邮件,你可以使用它从列表中获取不同的用户。例如

var distinctList = users.GroupBy(user => user.Id).Select(userGrp => userGrp.First()).ToList()

推荐阅读