public IDictionary <string, Schema> Create(IList <OpenApiMetadataResource> openApiMetadataResources)
        {
            var definitions = BoilerPlateDefinitions();

            openApiMetadataResources.Where(x => _openApiMetadataFactoryResourceFilterStrategy.ShouldInclude(x.Resource)).Select(
                r => new
            {
                key    = _openApiMetadataDefinitionsFactoryNamingStrategy.GetResourceName(r.Resource, r),
                schema = CreateResourceSchema(r)
            }).GroupBy(d => d?.key).Select(g => g.First()).ForEach(
                d =>
            {
                if (d != null)
                {
                    definitions.Add(d.key, d.schema);
                }
            });

            openApiMetadataResources.SelectMany(
                r => r.Resource.AllContainedItemTypes.Where(x => _openApiMetadataFactoryResourceFilterStrategy.ShouldInclude(x))
                .Select(
                    i => new
            {
                key    = _openApiMetadataDefinitionsFactoryNamingStrategy.GetContainedItemTypeName(r, i),
                schema = CreateResourceChildSchema(i, r)
            }).Concat(
                    openApiMetadataResources.SelectMany(s => s.Resource.AllContainedReferences).Select(
                        reference => new
            {
                key    = _openApiMetadataDefinitionsFactoryNamingStrategy.GetReferenceName(r.Resource, reference),
                schema = OpenApiMetadataDocumentHelper.CreateReferenceSchema(reference)
            }))).GroupBy(d => d?.key).Select(g => g.First()).ForEach(
                d =>
            {
                if (d != null)
                {
                    definitions.Add(d.key, d.schema);
                }
            });

            _definitionsFactoryEntityExtensionStrategy.GetEdFiExtensionBridgeDefinitions(openApiMetadataResources)
            .ForEach(pair => definitions.Add(pair.Key, pair.Value));

            return(new SortedDictionary <string, Schema>(definitions));
        }