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); } } }