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