public static List <Column> GetColumnsByTableId(
            DataTable syscolumns,
            DataTable systypes,
            DataTable defaultConstraints,
            int id,
            string tableName)
        {
            var columns  = new List <Column>();
            var skipList = TemplateConstants.FieldsToSkip
                           .Split(',')
                           .Select(a => a.Trim().ToLower())
                           .ToList();
            var selectedColumns = syscolumns.Select(
                "object_id = " + id,
                "column_id asc")
                                  .Where(a => skipList
                                         .All(s => tableName.ToLower() + "." + a["name"].ToString().ToLower() != s))
                                  .ToList();

            selectedColumns
            .ToList()
            .ForEach(a =>
            {
                var type = GetTypeByUserTypeId(
                    systypes,
                    (int)a["user_type_id"]);
                var column = new Column
                {
                    ClrType       = TableGenerator.GetClrType(type),
                    GeneratedName = NamingUtil.GetColumnName(tableName, a["name"].ToString()),
                    IsComputed    = Convert.ToBoolean(a["is_computed"]),
                    IsIdentity    = Convert.ToBoolean(a["is_identity"]),
                    IsNullable    = Convert.ToBoolean(a["is_nullable"]),
                    DefaultValue  = a["default_object_id"].ToString() != "0" ?
                                    defaultConstraints
                                    .Select(
                        "object_id = "
                        + a["default_object_id"].ToString())
                                    .Select(dc => dc["definition"].ToString())
                                    .SingleOrDefault()
                            : null,
                    Length    = Convert.ToInt32(a["max_length"]),
                    Name      = a["name"].ToString(),
                    Precision = Convert.ToInt32(a["precision"]),
                    Scale     = Convert.ToInt32(a["scale"]),
                    Type      = type
                };
                if (column.DefaultValue != null &&
                    DefaultValuesToBeExcluded.ContainsKey(column.DefaultValue.ToLower()))
                {
                    column.DefaultValue = null;
                }
                if (column.DefaultValue != null)
                {
                    column.DefaultValue = Regex.Replace(column.DefaultValue, @"[\(\)]", "");
                    column.DefaultValue = Regex.Replace(column.DefaultValue, @"\'", "\"");
                    column.DefaultValue = column.DefaultValue.Trim();
                    switch (column.ClrType)
                    {
                    case "bool":
                        column.DefaultValue = column.DefaultValue == "1" ? "true" : "false";
                        break;

                    case "Guid":
                        column.DefaultValue = "Guid.NewGuid()";
                        break;

                    case "DateTime" when column.DefaultValue.ToLower() == "getutcdate":
                        column.DefaultValue = "DateTime.UtcNow";
                        break;

                    case "DateTime":
                        column.DefaultValue = "DateTime.Parse(" + column.DefaultValue + ")";
                        break;

                    // ReSharper disable once RedundantEmptySwitchSection
                    default:
                        break;
                    }
                }
                columns.Add(column);
            });
            return(columns);
        }
        private static string GetNavigationPropertyAttributes(
            Table t,
            NavigationProperty n)
        {
            // need to support the following attributes
            // ForeignKey (needed if foreign key column name doesn't match nav prop name + "Id")
            // Index (needed if index that's not primary key exists)
            // Inverse (needed for multiple relationships between classes)
            // NotMapped (needed if any nav properties)
            // needed if source end of foreign key,
            // and type + "id" isn't a case-insensitive match to
            // the foreign key source property
            // (only supporting single property foreign keys with the ForeignKey
            // attribute for now) column source column
            var isSource             = n.ForeignKey.SourceTableName == t.TableName;
            var isSingleColumnKey    = n.ForeignKey.Columns.Count == 1;
            var foreignKeyProperties = string.Join(", ",
                                                   n.ForeignKey.Columns
                                                   .Select(a => NamingUtil.GetColumnName(t.TableName, a.SourceColumn)));
            var isInverse      = !string.IsNullOrWhiteSpace(n.InverseProperty);
            var displayNameKey = $"{t.TableName}.{n.Name}";
            var displayNeeded  = NavPropDisplayNames
                                 .ContainsKey(displayNameKey);
            var display = displayNeeded
                ? "Display(Name = \"" + NavPropDisplayNames[displayNameKey] + "\")"
                : "";
            var commaNeeded    = displayNeeded;
            var editableNeeded = EditableColumns.ContainsKey($"{t.TableName}.{n.Name}");
            var editable       = editableNeeded
                ? (commaNeeded ? ", " : "") + "Editable(true)"
                : "";

            commaNeeded = commaNeeded || editableNeeded;
            var foreignKeyNeeded =
                (isSource ||
                 isSingleColumnKey) &&
                !isInverse;
            var foreignKey = foreignKeyNeeded
                ? (commaNeeded ? ", " : "")
                             + "ForeignKey(\"" + foreignKeyProperties + "\")"
                : "";

            commaNeeded = commaNeeded || foreignKeyNeeded;
            var inverseNeeded = isInverse;
            var inverse       = inverseNeeded
                ? (commaNeeded ? ", " : "") +
                                "InverseProperty(\"" + n.InverseProperty + "\")"
                : "";
            var attrNeeded =
                foreignKeyNeeded ||
                inverseNeeded;
            var attr = attrNeeded
                ? "["
                       + display
                       + editable
                       + foreignKey
                       + inverse
                       + "]"
                : "";

            return(attr);
        }