private void RetrieveBoundOperationPaths()

in src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs [537:601]


        private void RetrieveBoundOperationPaths(OpenApiConvertSettings convertSettings)
        {
            foreach (var edmOperation in _model.GetAllElements().OfType<IEdmOperation>().Where(e => e.IsBound))
            {
                if (!CanFilter(edmOperation))
                {
                    continue;
                }

                IEdmOperationParameter bindingParameter = edmOperation.Parameters.First();
                IEdmTypeReference bindingType = bindingParameter.Type;

                bool isCollection = bindingType.IsCollection();
                if (isCollection)
                {
                    bindingType = bindingType.AsCollection().ElementType();
                }
                if (!bindingType.IsEntity())
                {
                    continue;
                }

                var firstEntityType = bindingType.AsEntity().EntityDefinition();

                bool filter(IEdmNavigationSource z) =>
                    z.EntityType() != firstEntityType &&
                    z.EntityType().FindAllBaseTypes().Contains(firstEntityType);

                var allEntitiesForOperation = new IEdmEntityType[] { firstEntityType }
                    .Union(_model.EntityContainer.EntitySets()
                            .Where(filter).Select(x => x.EntityType())) //Search all EntitySets
                    .Union(_model.EntityContainer.Singletons()
                            .Where(filter).Select(x => x.EntityType())) //Search all singletons
                    .Distinct()
                    .ToList();
                
                foreach (var bindingEntityType in allEntitiesForOperation)
                {
                    // 1. Search for corresponding navigation source path
                    if (AppendBoundOperationOnNavigationSourcePath(edmOperation, isCollection, bindingEntityType))
                    {
                        continue;
                    }

                    // 2. Search for generated navigation property
                    if (AppendBoundOperationOnNavigationPropertyPath(edmOperation, isCollection, bindingEntityType))
                    {
                        continue;
                    }

                    // 3. Search for derived
                    if (AppendBoundOperationOnDerived(edmOperation, isCollection, bindingEntityType, convertSettings))
                    {
                        continue;
                    }

                    // 4. Search for derived generated navigation property
                    if (AppendBoundOperationOnDerivedNavigationPropertyPath(edmOperation, isCollection, bindingEntityType, convertSettings))
                    {
                        continue;
                    }

                }
            }
        }