public static SchemaMetadata MappingDatabaseMetadataEntities(this IEnumerable <object> rawMetadata)
        {
            IEnumerable <dynamic> rawMetadataEntities = rawMetadata.Cast <dynamic>();
            var result = new SchemaMetadata()
            {
                Name = rawMetadataEntities.First().TABLE_CATALOG
            };

            foreach (var dbObject in rawMetadataEntities.GroupBy(g => g.TABLE_NAME).Select(s => new { Name = s.Key as string, PropertiesMetadata = s.ToList() }))
            {
                var metadataObject = new SchemaObjectMetadata()
                {
                    Name = dbObject.Name
                };

                foreach (var dbProperty in dbObject.PropertiesMetadata.GroupBy(g => g.COLUMN_NAME).Select(S => new { ColumnName = S.Key, columnMetadata = S.ToList() }))
                {
                    var generalColumnMetadata = dbProperty.columnMetadata.First();
                    var FKName   = dbProperty.columnMetadata.Where(w => w.IS_FK == 1).Select(s => (string)s.CONSTRAINT_NAME).FirstOrDefault();
                    var property = new SchemaPropertyMetadata()
                    {
                        Name               = dbProperty.ColumnName,
                        IsNullable         = generalColumnMetadata.IS_NULLABLE == 1,
                        PropertyType       = generalColumnMetadata.DATA_TYPE,
                        DefaultValue       = generalColumnMetadata.COLUMN_DEFAULT,
                        IsForeingKey       = !string.IsNullOrEmpty(FKName),
                        FKName             = FKName,
                        IsUnique           = dbProperty.columnMetadata.Where(w => w.IS_UNIQUE == 1).Count() > 0,
                        IsKey              = dbProperty.columnMetadata.Where(w => w.IS_KEY == 1).Count() > 0,
                        MaxCharacterLength = generalColumnMetadata.CHARACTER_MAXIMUM_LENGTH,
                        NumericPrecision   = generalColumnMetadata.NUMERIC_PRECISION,
                        NumericScale       = generalColumnMetadata.NUMERIC_SCALE
                    };

                    metadataObject.DatabaseObjectProperties.Add(property);

                    if (property.IsForeingKey)
                    {
                        metadataObject.HasDependency = true;
                    }
                }
                result.DatabaseObjects.Add(metadataObject);
            }
            return(result);
        }
        private async Task <MockObjectData> GenerateMockDataByMetadataSchemaAndDependenciesData(SchemaObjectMetadata schemaObjectMetadata,
                                                                                                MockDataGeneratorOptions options, IEnumerable <MockObjectData> mockDataCreated, List <SchemaObjectDependencyMedatada> dependencyMetadatas)
        {
            var propertyGenerator = new SqlServerMockPropertiesValueGenerator();
            var dependencies      = dependencyMetadatas?.Where(w => w.DependentObjectName.Equals(schemaObjectMetadata.Name));

            var dependencyData = mockDataCreated?.SelectMany(s => s.propertyValues.Where(w =>
                                                                                         dependencies?.Where(ww => ww.PrimaryObjectName.Equals(s.Schema.Name) &&
                                                                                                             ww.PrimaryObjectPropertyName.Equals(w.PropertyName))
                                                                                         .Any() ?? false));

            var values = schemaObjectMetadata.DatabaseObjectProperties
                         .Select(
                s =>
            {
                MockDataPropertyValues foreingKeyData = null;
                if (s.IsForeingKey)
                {
                    var dependency = dependencies.Where(w => w.DependentObjectPropertyName.Equals(s.Name)).FirstOrDefault();
                    foreingKeyData = dependencyData?.Where(w => w.PropertyName.Equals(dependency?.PrimaryObjectPropertyName)).FirstOrDefault();
                }
                return(propertyGenerator.GenerateMockedValuesByPropertyMetadata(s, options, foreingKeyData));
            }
                ).ToArray();

            return(await Task.Run(() => new MockObjectData()
            {
                Schema = schemaObjectMetadata, propertyValues = values
            }));
        }