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);
        }
        public MockDataPropertyValues GenerateMockedValuesByPropertyMetadata(SchemaPropertyMetadata propertyMetadata, MockDataGeneratorOptions options, MockDataPropertyValues dependecyValues = null)
        {
            var result = new MockDataPropertyValues();

            result.PropertyName = propertyMetadata.Name;

            result.Values.AddRange(new object[(options?.DataAmount ?? 100)]);

            if (dependecyValues != null)
            {
                result.PropertyType = dependecyValues.PropertyType;
                AddRamdomValueForMockDataProperties(result, r => dependecyValues.Values[r.Next(dependecyValues.Values.Count)]);
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.BigInt).ToLower()))
            {
                result.PropertyType = typeof(Int64);
                GenerateMaxValueDataFromPrimitiveType(result);
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Binary).ToLower()))
            {
                result.PropertyType = typeof(SqlBinary);
                AddRamdomValueForMockDataProperties(result, r =>
                {
                    var rdn = new byte[new Random().Next(8000)];
                    r.NextBytes(rdn);
                    return(new SqlBinary(rdn));
                });
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Bit).ToLower()))
            {
                result.PropertyType = typeof(bool);
                AddRamdomValueForMockDataProperties(result, r => (object)(r.Next(2) == 1 ? true : false));
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Char).ToLower()))
            {
                result.PropertyType = typeof(SqlChars);
                AddRamdomValueForMockDataProperties(result, r =>
                {
                    int charsize     = propertyMetadata.MaxCharacterLength.GetValueOrDefault(r.Next(8000));
                    var charscreated = new char[charsize];


                    return(new SqlChars(charscreated.ToList().Select(s => Convert.ToChar(r.Next(256))).ToArray()));
                });
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.DateTime).ToLower()))
            {
                result.PropertyType = typeof(DateTime);
                AddRamdomValueForMockDataProperties(result, r => DateTime.Now.AddMinutes(r.Next(1444)));
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Decimal).ToLower()) || propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Money).ToLower()))
            {
                result.PropertyType = typeof(SqlDecimal);
                AddRamdomValueForMockDataProperties(result, r => new SqlDecimal(decimal.Round((new decimal(r.NextDouble()) * decimal.MaxValue) / propertyMetadata.NumericPrecision.GetValueOrDefault(int.MaxValue), propertyMetadata.NumericScale.GetValueOrDefault(0))));
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Float).ToLower()) || propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Real).ToLower()) || propertyMetadata.PropertyType.Equals(nameof(SqlDbType.SmallMoney).ToLower()))
            {
                result.PropertyType = typeof(SqlDouble);
                AddRamdomValueForMockDataProperties(result, r => new SqlDouble(r.NextDouble() * float.MaxValue));
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Image).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Int).ToLower()))
            {
                result.PropertyType = typeof(SqlInt32);
                AddRamdomValueForMockDataProperties(result, r => r.Next());
            }
            else

            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.NChar).ToLower()) || propertyMetadata.PropertyType.Equals(nameof(SqlDbType.NVarChar).ToLower()))
            {
                result.PropertyType = typeof(SqlChars);
                AddRamdomValueForMockDataProperties(result, r =>
                {
                    int charsize     = propertyMetadata.MaxCharacterLength.GetValueOrDefault(r.Next(8000));
                    var charscreated = new char[charsize];


                    return(new SqlChars(charscreated.ToList().Select(s => Convert.ToChar(r.Next(256))).ToArray()));
                });
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.NText).ToLower()))
            {
            }
            else

            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.UniqueIdentifier).ToLower()))
            {
                result.PropertyType = typeof(Guid);
                GenerateGuidRamdomValues(result);
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.SmallDateTime).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.SmallInt).ToLower()))
            {
                result.PropertyType = typeof(SqlInt16);
                AddRamdomValueForMockDataProperties(result, r => r.Next(short.MaxValue));
            }
            else

            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Text).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Timestamp).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.TinyInt).ToLower()))
            {
                result.PropertyType = typeof(SqlByte);
                AddRamdomValueForMockDataProperties(result, r => r.Next(Byte.MaxValue));
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.VarBinary).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.VarChar).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Variant).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Xml).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Udt).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Structured).ToLower()))
            {
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Date).ToLower()))
            {
                result.PropertyType = typeof(SqlDateTime);
                GenerateMaxValueDataFromPrimitiveType(result);
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.Time).ToLower()))
            {
                result.PropertyType = typeof(TimeSpan);
                AddRamdomValueForMockDataProperties(result, r => DateTime.Now.TimeOfDay);
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.DateTime2).ToLower()))
            {
                result.PropertyType = typeof(DateTime);
                AddRamdomValueForMockDataProperties(result, r => DateTime.Now.AddMinutes(r.Next(1444)));
            }
            else
            if (propertyMetadata.PropertyType.Equals(nameof(SqlDbType.DateTimeOffset).ToLower()))
            {
            }
            else
            {
            }
            return(result);
        }