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