Skip to content

Instantly share code, notes, and snippets.

@jmreynolds
Forked from jamesmanning/GetDatabaseInfo.linq.cs
Created February 23, 2016 00:13
Show Gist options
  • Save jmreynolds/9417aaaa99b102cffe8e to your computer and use it in GitHub Desktop.
Save jmreynolds/9417aaaa99b102cffe8e to your computer and use it in GitHub Desktop.
LINQPad script to get basic schema information about the currently selected database (assumes LINQPad's default data context creation method)
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();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment