数据库查询 - DataTable转Entity类型数据

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

 

posted @ 2019-10-25 18:29  唐宋元明清2188  阅读(652)  评论(0编辑  收藏  举报