当使用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 }