#azure-functions #azure-durable-functions
#azure-функции #azure-долговечные-функции
Вопрос:
Я пытаюсь написать надежную функцию, чтобы узнать узлы до n уровней. Например, если уровень = 3, выход должен быть A, B, C, D, E, F. Кроме того, уровень 1 может включать большее количество узлов.
Вот мой код:
public async Tasklt;Listlt;stringgt;gt; ProcessQueryAsync([OrchestrationTrigger] IDurableOrchestrationContext context) { var request = context.GetInputlt;gt;(); var rootIds = request.Ids; var entities = new Listlt;PersonEntitygt;(); var rootTasks = GetRootTask(context, rootIds, request); -gt; gets all nodes on level 1 var allRootEntities = await Task.WhenAll(rootTasks); if (level != 1) { var childrenTasks = GetChildrenTask(context, allRootEntities, request, level); var allChildrenEntities = await Task.WhenAll(childrenTasks); entities.AddRange(allChildrenEntities); } else { entities.AddRange(allRootEntities); } } private Tasklt;Listlt;PersonEntitygt;gt;[] GetChildrenTask(IDurableOrchestrationContext context, RootEntity[] allRootEntities, SyncJob syncJob, int level) { var managerTaskCount = 0; var entityTasks = new Tasklt;Listlt;PersonEntitygt;gt;[allRootEntities.Length]; foreach (var parent in allRootEntities) { var otherParentEntities = allRootEntities.Select(entity =gt; entity.PersonnelNumber).ToList() .Except(new string[] { parent.PersonnelNumber }).ToList(); entityTasks[managerTaskCount ] = context.CallActivityAsynclt;Listlt;PersonEntitygt;gt;( nameof(ChildEntitiesReaderFunction), new ChildEntitiesReaderRequest { ParentEntity = parent, SyncJob = syncJob, Level = level, OtherOrgLeaderIds = otherParentEntities }); ; } return entityTasks; } // ChildEntitiesReaderFunction var childEntities = GetChildEntitiesAsync(request.ParentEntity, request.SyncJob, request.Depth, request.OtherOrgLeaderIds); public async Tasklt;Listlt;PersonEntitygt;gt; GetChildEntitiesAsync(PersonEntity parentEntity, SyncJob syncJob, int level, Listlt;stringgt; orgLeadersToExclude) { level--; var allEntities = new Listlt;PersonEntitygt; { parentEntity }; Listlt;PersonEntitygt; directChildEntities = null; directChildEntities = await _tableService.ExecuteQueryAsync(); var taskIndex = 0; var readTasks = new Tasklt;Listlt;PersonEntitygt;gt;[directChildEntities.Count(x =gt; x.Childcount gt; 0)]; foreach (var child in directChildEntities) { if (orgLeadersToExclude.Contains(child.PersonnelNumber)) { continue; } if (child.Childcount gt; 0 amp;amp; depth != 1) { readTasks[taskIndex ] = GetChildEntitiesAsync(child, syncJob, depth, orgLeadersToExclude); } else { allEntities.Add(child); } } var validTasks = readTasks.Where(task =gt; task != null).ToList(); if (validTasks.Count gt; 0) { foreach (var result in await Task.WhenAll(validTasks)) { allEntities.AddRange(result); } } return allEntities; }
Есть ли способ добавить больше действий, чтобы заставить детей выполнять это быстрее?