数据库查询 - DataTable转Entity类型数据
程序员文章站
2022-05-03 22:16:56
当使用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 }
上一篇: 数据库学习其二 从表空间到临时表空间
推荐阅读
-
asp.net core系列 29 EF模型配置(查询类型,关系数据库建模)
-
数据库查询 - DataTable转Entity类型数据
-
数据库查询 - DataTable转Entity类型数据
-
【Android 应用】数据库实例---包含String转时间戳、查询升序
-
大数据量高并发的数据库优化,sql查询优化(转)
-
SQLserver、MySQL、ORCAL查询数据库、表、表中字段以及字段类型
-
Oracle number类型前端界面和数据库查询不一致 number精度问题
-
Oracle数据库clob类型转String类型(ssh)
-
php查询数据库的int字段,打印出来怎么是字符串类型呢?
-
急急PHP,数据库中createtime字段类型为datetime,怎样根据这个查询一段时间内的数据