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