private IEnumerable <ID> DoGetChildIDs(ItemDefinition itemDefinition, CallContext context)
        {
            var headChildIDs = HeadProvider
                               .GetChildIDs(itemDefinition, context)?
                               .Cast <ID>().ToArray() ?? EmptyIds;

            var readOnlyChildIDs = ReadOnlyProviders
                                   .SelectMany(x => x
                                               .GetChildIDs(itemDefinition)?
                                               .Select(ID.Parse) ?? EmptyIds);

            var childIDs = headChildIDs.Concat(readOnlyChildIDs)         // .Join()
                           .GroupBy(x => x.Guid).Select(x => x.First()); // .Distinct()

            // deleted or moved out items must be get off the list
            var itemId = itemDefinition.ID;

            foreach (var childID in childIDs)
            {
                var parentId = HeadProvider.GetParentID(new ItemDefinition(childID, string.Empty, ID.Null, ID.Null), context);
                if (ReferenceEquals(parentId, null) || parentId == itemId)
                {
                    yield return(childID);
                }
            }
        }