LINQ to SQL如何列舉資料表的欄位名稱

LINQ to SQL如何列舉資料表的欄位名稱,本文將介紹利用AttributeMappingSource類別來達到上述需求。

在論壇上有朋友提到如何在LINQ to SQL中取得資料表中的欄位名稱,找到在MSDN文件庫及MSDN Blog上利用AttributeMappingSource類別的GetModel方法可以達到這樣的目的,實作過程說明如下:

首先必須先引用System.Data.Linq.Mapping Namespace,接著以下列的程式碼列舉資料表的欄位資訊:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using System.Web.UI;
   6:  using System.Web.UI.WebControls;
   7:  using System.Data.Linq.Mapping;
   8:   
   9:  namespace WebApplication6
  10:  {
  11:      public partial class AttMapSrcDemo : System.Web.UI.Page
  12:      {
  13:          protected void Page_Load(object sender, EventArgs e)
  14:          {
  15:              AttributeMappingSource ams = new AttributeMappingSource();
  16:              //取得DataContext
  17:              MetaModel mm = ams.GetModel(typeof(DataClasses1DataContext));
  18:              //利用GetTables方法取得所有資料表
  19:              foreach (MetaTable mt in mm.GetTables())
  20:              {
  21:                  //利用TableName屬性取得對應的資料表名稱
  22:                  Response.Write(string.Format("Table:{0}<br/>", mt.TableName));
  23:                  //利用MetaTable.RowType屬性取得資料列型別,再透過DataMembers屬性取得欄位的各項資訊
  24:                  foreach (MetaDataMember mdm in mt.RowType.DataMembers)
  25:                  {
  26:                      //使用DataMembers的Name、DbType及IsPrimaryKey來取得欄位的各項資訊
  27:                      Response.Write(string.Format("Colmun:{0},Type:{1},IsPrimaryKey:{2}<br/>", mdm.Name, mdm.DbType, mdm.IsPrimaryKey));
  28:                  }
  29:                  Response.Write("<hr/>");
  30:              }
  31:          }
  32:      }
  33:  }

 

上述程式碼的第15列筆者使用AttributeMappingSource類別取得類別所對應的資料表,接者利用GetModel方法取得DataContext,其中第17列的DataContext類別名稱可以從dbml檔的屬性看到(如下圖)。

 

image

 

再來loop取得MetaModel的GetTables方法所回傳的所有資料表(如第19列),最後在每個MetaTable的RowType屬性的DataMembers屬性中便可找到詳細的欄位資訊(如第24列)。本文簡單示範取得欄位名稱、欄位型態及是否為Primary Key三種資訊,其他像是是否可為NULL或計算資料行等資訊,各位可以參考MetaDataMember類別,執行結果如下:

 

image

 

【參考資料】