private async Task ReloadAsync()

in src/Epam.GraphQL/Loaders/MutableLoader.cs [564:641]


        private async Task ReloadAsync(IResolveFieldContext context, SaveResult<TEntity, TId, TExecutionContext> saveResult, IEnumerable<string> fieldNames)
        {
            if (!fieldNames.Any())
            {
                return;
            }

            fieldNames = fieldNames.Concat(new[] { IdExpression.NameOf() }).Distinct();

            var profiler = context.GetProfiler();
            using (profiler.Step($"{GetType().HumanizedName()}.{nameof(ReloadAsync)}"))
            {
                var batcher = context.GetBatcher();
                var ctx = context.GetUserContext<TExecutionContext>();
                var dataContext = context.GetDataContext();
                var queryExecuter = context.GetQueryExecuter();
                var batch = BatchHelpers.GetLoaderQueryFactory<MutableLoader<TEntity, TId, TExecutionContext>, TEntity, TId, TExecutionContext>(
                    () => "ReloadAsync", this, IdExpression)(profiler, queryExecuter, null, ctx); // TBD hookExecuter is null here

                var entities = saveResult.ProcessedItems;

                var payloads = entities
                    .Where(e => e.Payload != null)
                    .Select(e => e.Payload!);

                payloads.ForEach(item => dataContext.DetachEntity(item));

                var ids = payloads.Select(GetId);

                // That portion of reload goes against batcher
                var reloadedEntities = await batch.LoadAsync(ids).GetResultAsync().ConfigureAwait(false);

                var errors = new List<string>();

                foreach (var entity in entities)
                {
                    if (entity.Payload == null)
                    {
                        continue;
                    }

                    var id = GetId(entity.Payload);
                    var result = reloadedEntities
                        .Where(reloaded => reloaded != null && EqualityComparer<TId>.Default.Equals(reloaded.Key, id))
                        .ToList();

                    if (!result.Any())
                    {
                        entity.Payload = default;
                    }
                    else if (result.Count > 1)
                    {
                        errors.Add($"Cannot reload entity: More than one entity was found (type: {typeof(TEntity).HumanizedName()}: id = {id})");
                    }
                    else
                    {
                        var group = result.Single().ToList();
                        if (!group.Any())
                        {
                            entity.Payload = default;
                        }
                        else if (group.Count > 1)
                        {
                            errors.Add($"Cannot reload entity: More than one entity was found (type: {typeof(TEntity).HumanizedName()}: id = {id})");
                        }
                        else
                        {
                            entity.Payload = group.Single();
                        }
                    }
                }

                if (errors.Any())
                {
                    throw new ExecutionError(string.Join("\n\r", errors));
                }
            }
        }