當使用Sql語句查詢資料庫,返回DataSet數據集。 DataSet轉化為數據列表,可以通過映射方式直接返回Entity數據列表 新建一個特性類,用於資料庫列表列名稱映射 LinqToDB提供了一個ColumnAttribute,但是通過反射不方便獲取ColumnAttribute獲取Custom ...
當使用Sql語句查詢資料庫,返回DataSet數據集。
DataSet轉化為數據列表,可以通過映射方式直接返回Entity數據列表
新建一個特性類,用於資料庫列表列名稱映射
LinqToDB提供了一個ColumnAttribute,但是通過反射不方便獲取ColumnAttribute
獲取CustomAttributes時,雖然可以篩選到指定ColumnAttribute,但是CustomAttributeData不容易轉換到ColumnAttribute
var customAttributeDatas = mi.CustomAttributes.Where(i=>i.AttributeType.Name==nameof(ColumnAttribute)).ToList();
以下是自定義的特性類
1 [AttributeUsage(AttributeTargets.Property)] 2 public sealed class ColumnFieldAttribute : Attribute 3 { 4 /// <summary> 5 /// 表對應的欄位名 6 /// </summary> 7 public string ColumnName { set; get; } 8 9 public ColumnFieldAttribute(string columnName) 10 { 11 ColumnName = columnName; 12 } 13 }
通過反射,將DataTable轉換為數據列表
1 /// <summary> 2 /// 將DataRow/DataTable轉換成Entity類型 3 /// </summary> 4 public static class DataTableConverter<T> where T : new() 5 { 6 /// <summary> 7 /// 將DataTable轉換成Entity列表 8 /// </summary> 9 /// <param name="dt"></param> 10 /// <returns></returns> 11 public static List<T> ToList(DataTable dt) 12 { 13 List<T> list = new List<T>(dt.Rows.Count); 14 foreach (DataRow dr in dt.Rows) 15 { 16 list.Add(ToEntity(dr)); 17 } 18 return list; 19 } 20 /// <summary> 21 /// 將DataRow行轉換成Entity 22 /// </summary> 23 /// <param name="dr"></param> 24 /// <returns></returns> 25 private static T ToEntity(DataRow dr) 26 { 27 T entity = new T(); 28 Type info = typeof(T); 29 var members = info.GetMembers(); 30 foreach (var memberInfo in members) 31 { 32 if (memberInfo.MemberType == MemberTypes.Property) 33 { 34 //讀取屬性上的DataField特性 35 object[] attributes = memberInfo.GetCustomAttributes(typeof(ColumnFieldAttribute), true); 36 foreach (var attr in attributes) 37 { 38 var dataFieldAttr = attr as ColumnFieldAttribute; 39 if (dataFieldAttr != null) 40 { 41 var propInfo = info.GetProperty(memberInfo.Name); 42 if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName)) 43 { 44 //根據ColumnName,將dataRow中的相對欄位賦值給Entity屬性 45 propInfo.SetValue(entity, 46 Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType), 47 null); 48 } 49 } 50 } 51 } 52 } 53 return entity; 54 } 55 }