[C#] LinqToSQL의 Table명, Column명 얻기

2011. 11. 8. 13:27Database/LINQ to SQL

개발생산성 향상도구를 구축하는데 있어서 DB의 Table Name 또는 Column Name 등의 Meta Data을 얻는 기능은 매우 유용합니다. 각 Table Name과 Column Name을 바탕으로 Application의 List/Detail Code를 회사의 개발정책에 맞추어 자동 생성하거나, 보고서의 기본양식도 자동으로 생성할 수 있기 때문입니다. 여기에서는 C#에서 MetaModel 개체를 이용하여 이러한 정보를 얻는 방법에 대해서 안내해드리고자 합니다.

LinqToSQL이 아닌 MS SQL의 Meta Table을 통해서도 똑같은 정보를 얻을 수 있는데 자세한 내용은 http://nsinc.tistory.com/21를 참고하시기 바랍니다.

구현

MetaModel은 LinqToSQL이 DB에 대해서 Mapping한 거의 모든 정보를 조회할 수 있는 개체입니다. 여기에서는 Table명, Column명,  각 Type까지 얻는 방법에 대해 예제코드와 함께 설명 드리고자 합니다.

먼저 MetaModel을 얻을 수 있는 간단한 방법인 AttributeMappingSource를 이용한 방법입니다. 이는 DataContext를 실제 생성하지 않고도 바로 정보를 조회할 수 있는 방법이기도 합니다.

//1. MetaModel 생성
MetaModel model = new AttributeMappingSource().GetModel(typeof(TestDBDataContext));
IEnumerable<MetaTable> lstTables = model.GetTables();

//2. MetaModel에서 데이터 조회
List<string> lstResult = new List<string>();
foreach (MetaTable table in lstTables)
    lstResult.Add(table.TableName);

//3. 출력
grdResult.DataSource = lstResult;
grdResult.DataBind();

위와 다르게 DataContext를 이미 생성하였다면 아래와 같이 Mapping Property를 통해 바로 MetaModel을 얻을 수도 있는데 아래와 같습니다.

using (TestDBDataContext db = new TestDBDataContext() { ObjectTrackingEnabled = false })
{
    //1. MetaModel 생성
    MetaModel model = db.Mapping;
    IEnumerable<MetaTable> lstTables = model.GetTables();

    //2. MetaModel에서 데이터 조회
    List<string> lstResult = new List<string>();
    foreach (MetaTable table in lstTables)
        lstResult.Add(table.TableName);

    //3. 출력
    grdResult.DataSource = lstResult;
    grdResult.DataBind();
}

Table명 뿐만 아니라 Column의 이름과 Type를 얻는 방법은 아래와 같습니다.

MetaModel model = new AttributeMappingSource().GetModel(typeof(TestDBDataContext));
MetaTable table = model.GetTables().Single(t => t.TableName == "dbo.TestTable");
ReadOnlyCollection<MetaDataMember> lstColumns = table.RowType.DataMembers;

List<string> lstResult = new List<string>();
foreach (MetaDataMember column in lstColumns)
    lstResult.Add(column.MappedName + " (" + column.Type + ")");

grdResult.DataSource = lstResult;
grdResult.DataBind();

참고 Site: http://blogs.msdn.com/b/jomo_fisher/archive/2007/07/30/linq-to-sql-trick-get-all-table-names.aspx