Skip to content

Instantly share code, notes, and snippets.

@jamesmanning
Last active January 15, 2024 03:54
Show Gist options
  • Select an option

  • Save jamesmanning/4391786 to your computer and use it in GitHub Desktop.

Select an option

Save jamesmanning/4391786 to your computer and use it in GitHub Desktop.

Revisions

  1. jamesmanning renamed this gist Dec 27, 2012. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. jamesmanning renamed this gist Dec 27, 2012. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. jamesmanning created this gist Dec 27, 2012.
    85 changes: 85 additions & 0 deletions gistfile1.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,85 @@
    void Main()
    {
    var databaseInfo = GetDatabaseInfo(this);
    databaseInfo.Dump();
    }

    // Define other methods and classes here
    public class DatabaseInfo
    {
    public Type DataContextType { get; set; }
    public string DatabaseName { get; set; }
    public string DatabaseServer { get; set; }
    public TableInfo[] Tables { get; set; }
    }

    public class TableInfo
    {
    public Type TableType { get; set; }
    public Type EntityType { get; set; }
    public string TableName { get; set; }
    public ColumnInfo[] Columns { get; set; }
    }

    public class ColumnInfo
    {
    public string ColumnName { get; set; }
    public string DatabaseType { get; set; }
    }

    public DatabaseInfo GetDatabaseInfo(LINQPad.DataContextBase dataContext)
    {
    return new DatabaseInfo
    {
    DatabaseName = dataContext.Connection.Database,
    DatabaseServer = dataContext.Connection.DataSource,
    DataContextType = dataContext.GetType(),
    Tables = GetTables(dataContext.GetType()),
    };
    }

    public TableInfo[] GetTables(Type dataContextType)
    {
    var tableInfoQuery =
    from prop in dataContextType.GetProperties()
    where prop.PropertyType.IsGenericType
    where prop.PropertyType.GetGenericTypeDefinition() == typeof(Table<>)
    let tableType = prop.PropertyType
    let entityType = tableType.GenericTypeArguments.Single()
    select new TableInfo
    {
    TableName = GetTableNameFromEntityType(entityType),
    EntityType = entityType,
    TableType = tableType,
    Columns = GetColumnsFromEntityType(entityType),
    };

    return tableInfoQuery.ToArray();
    }

    public string GetTableNameFromEntityType(Type entityType)
    {
    var tableNameQuery =
    from ca in entityType.CustomAttributes
    from na in ca.NamedArguments
    where na.MemberName == "Name"
    select na.TypedValue.Value.ToString();

    return tableNameQuery.Single();
    }

    public ColumnInfo[] GetColumnsFromEntityType(Type entityType)
    {
    var columnInfoQuery =
    from field in entityType.GetFields()
    from attribute in field.CustomAttributes
    from namedArgument in attribute.NamedArguments
    where namedArgument.MemberName == "DbType"
    select new ColumnInfo
    {
    ColumnName = field.Name,
    DatabaseType = namedArgument.TypedValue.Value.ToString(),
    };

    return columnInfoQuery.ToArray();
    }