在實際開發過程中,或者是第三方公司提供的資料表結構,與我們系統中的實體類欄位不對應,遇到這樣我們怎麼處理呢?可能有人會說,在轉換時建立一個實體物件,對錶裡的資料逐行遍曆來執行個體化這個實體物件不就完了。的確沒錯,這方法可行,但是這個方法效率極低,遇到億萬資料的話那就要執行個體化億萬個對象,由此可見它的效率了。
先看一下我的實體類
/// <summary>/// 具體的實體類,和資料表中不同/// </summary>public class Person{ [DataField("user_name")]//表示資料庫表裡面的欄位 public string UserName { set; get; }//表示需要轉換成的欄位 [DataField("pass_word")] public string PassWord { set; get; }}
具體在代碼中有注釋,下面是轉換類
[AttributeUsage(AttributeTargets.Property)]public sealed class DataFieldAttribute : Attribute{ /// <summary> /// 表對應的欄位名 /// </summary> public string ColumnName { set; get; } public DataFieldAttribute(string columnName) { ColumnName = columnName; }}public static class DataConvert<T> where T : new(){ /// <summary> /// 將DataRow行轉換成Entity /// </summary> /// <param name="dr"></param> /// <returns></returns> public static T ToEntity(DataRow dr) { T entity = new T(); Type info = typeof(T); var members = info.GetMembers(); foreach (var mi in members) { if (mi.MemberType == MemberTypes.Property) { //讀取屬性上的DataField特性 object[] attributes = mi.GetCustomAttributes(typeof(DataFieldAttribute), true); foreach (var attr in attributes) { var dataFieldAttr = attr as DataFieldAttribute; if (dataFieldAttr != null) { var propInfo = info.GetProperty(mi.Name); if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName)) { //根據ColumnName,將dr中的相對欄位賦值給Entity屬性 propInfo.SetValue(entity, Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType), null); } } } } } return entity; } /// <summary> /// 將DataTable轉換成Entity列表 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ToList(DataTable dt) { List<T> list = new List<T>(dt.Rows.Count); foreach (DataRow dr in dt.Rows) { list.Add(ToEntity(dr)); } return list; }}
調用代碼:
DataTable dt = new DataTable();dt.Columns.Add("user_name");dt.Columns.Add("pass_word");//這是表中的欄位,現在需要將它們轉換為具體的實體類執行個體dt.Rows.Add("kingtiger","1");dt.Rows.Add("wangbiao", "2");var users = DataConvert<Person>.ToList(dt);foreach (var user in users){ Response.Write(user.UserName + "," + user.PassWord);}for (int i = 0; i < dt.Rows.Count; i++){ Person p = DataConvert<Person>.ToEntity(dt.Rows[i]); Response.Write(p.UserName + "," + p.PassWord);}