欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-09-27 21:39:55
当使用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     }