当前位置: 移动技术网 > IT编程>开发语言>c# > 数据库查询 - DataTable转Entity类型数据

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

2019年10月26日  | 移动技术网IT编程  | 我要评论
当使用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     }

 

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网