(转)DataTable与结构不同实体类之间的转换
原文地址:http://www.cnblogs.com/kinger906/p/3428855.html
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了。的确没错,这方法可行,但是这个方法效率极低,遇到亿万数据的话那就要实例化亿万个对象,更要命的是还要对每个对象的字段逐一赋值,由此可见它的效率了。
今天我无意在网上看到了一大牛写的一段代码,让我很感慨,现在我将它记录下来,希望对以后开发过程中有所用。
先看一下我的实体类
1
2
3
4
5
6
7
8
9
10
|
/// <summary>
/// 具体的实体类,和数据表中不同
/// </summary>
public class Person
{
[DataField( "user_name" )] //表示数据库表里面的字段
public string UserName { set ; get ; } //表示需要转换成的字段
[DataField( "pass_word" )]
public string PassWord { set ; get ; }
}
|
具体在代码中有注释,下面是转换类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
[AttributeUsage(AttributeTargets.Property)]
public sealed class DataFieldAttribute : Attribute
{
/// <summary>
/// 表对应的字段名
/// </summary>
public string ColumnName { set ; get ; }
public DataFieldAttribute( string columnName)
{
ColumnName = columnName;
}
}
public static class DataConvert<T> where T : new ()
{
/// <summary>
/// 将DataRow行转换成Entity
/// </summary>
/// <param name="dr"></param>
/// <returns></returns>
public static T ToEntity(DataRow dr)
{
T entity = new T();
Type info = typeof (T);
var members = info.GetMembers();
foreach ( var mi in members)
{
if (mi.MemberType == MemberTypes.Property)
{
//读取属性上的DataField特性
object [] attributes = mi.GetCustomAttributes( typeof (DataFieldAttribute), true );
foreach ( var attr in attributes)
{
var dataFieldAttr = attr as DataFieldAttribute;
if (dataFieldAttr != null )
{
var propInfo = info.GetProperty(mi.Name);
if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName))
{
//根据ColumnName,将dr中的相对字段赋值给Entity属性
propInfo.SetValue(entity,
Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType),
null );
}
}
}
}
}
return entity;
}
/// <summary>
/// 将DataTable转换成Entity列表
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> ToList(DataTable dt)
{
List<T> list = new List<T>(dt.Rows.Count);
foreach (DataRow dr in dt.Rows)
{
list.Add(ToEntity(dr));
}
return list;
}
}
|
调用代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
DataTable dt = new DataTable();
dt.Columns.Add( "user_name" );
dt.Columns.Add( "pass_word" ); //这是表中的字段,现在需要将它们转换为具体的实体类实例
dt.Rows.Add( "kingtiger" , "1" );
dt.Rows.Add( "wangbiao" , "2" );
var users = DataConvert<Person>.ToList(dt);
foreach ( var user in users)
{
Response.Write(user.UserName + "," + user.PassWord);
}
for ( int i = 0; i < dt.Rows.Count; i++)
{
Person p = DataConvert<Person>.ToEntity(dt.Rows[i]);
Response.Write(p.UserName + "," + p.PassWord);
}
|
转载于:https://www.cnblogs.com/fcsh820/p/3438483.html
(转)DataTable与结构不同实体类之间的转换相关推荐
- DataTable与结构不同实体类之间的转换
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了.的 ...
- mysql 数据转换dataset_【转】dataset和实体类 之间的转换
usingSystem; usingSystem.Collections.Generic; usingSystem.Data; usingSystem.Data.Common; usingSystem ...
- java entity转dto_java 使用反射在dto和entity 实体类之间进行转换
public class Utils { /** * 将dto和entity之间的属性互相转换,dto中属性一般为String等基本类型, * 但是entity中可能有复合主键等复杂类型,需要注意同名 ...
- sql时间格式转换yyyymm_XML和实体类之间的转换
言简意赅: 1.jar包的maven 坐标 <dependency> <groupId>com.thoughtworks.xstreamgroupId> <arti ...
- Java通过Fastjson实现JSONObject对象、Json字符串以及Java实体类之间互相转换
导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</arti ...
- c语言xml序列化,C# XML和实体类之间相互转换(序列化和反序列化)
我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...
- java xml 实体类_java中的xml与实体类之间的映射
实体类: package xml; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class User ...
- Android JSON数据与实体类之间的相互转化-------GSON的简单用法
Android JSON数据与实体类之间的相互转化-------GSON的用法 1_Gson的导入 1.1_方法一:直接导入jar包 1.2_方法二:引入依赖 2_json形式的字符串互转实体对象 2 ...
- C#利用反射将Datatable转化为指定实体类ListT
背景介绍 在软件开发中肯定免不了和数据库打交道,我们对数据的增删改查最终会转化为SQL在数据库中执行.从SQLServer中查出数据一般有两种方式:一是ADO.NET直接写SQL语句从数据中查出数据, ...
最新文章
- java实现验证码功能
- 深度学习框架哪家强?国产框架OneFlow做了一份测评报告
- [JVM-1]Java运行时数据区域
- 韩寒:出了国才知道,外国是多么的落后(写的真委婉~不愧是韩寒)
- python元类的简单了解
- 乐鑫代理-启明云端分享ESP32系列教程之二:Linux搭建esp-idf环境
- Linux 对应ARP欺骗的一种被动方法[转]
- kite 使用 go_使用Apache Storm和Kite SDK Morphlines的可配置ETL处理
- 电脑微信扫一扫在哪_怎么进入和管理企业微信的后台?
- 青海大学计算机考研调剂,青海大学2020年硕士研究生招生调剂公告
- LaTeX的常用命令
- atmega328 48手动解锁 擦除
- 开发3dMax插件的方法和应用
- 关于公司备份软件选型
- 以一例教你找到【无水印】【高清】【百度图片】的url
- docker 问题集
- 简要讨论python在拼多多关键字搜索、商品详情API接口做好电商选品的作用
- Epicor BPM - 在VS中编写BPM代码
- echarts map 地图做出立体效果 | 简单的解
- 抖音上很火的H53D立体动态相册效果
热门文章
- 前几年系列3:无间道2(由人物到剧情)
- 计算机模拟图像和数字,图像与数字图像基础
- 长安大学计算机专业考研科目,长安大学《计算机类学科基础》2021年硕士研究生初试考试内容范围及参考书目...
- CCProxy代理上网设置方法
- 多目标跟踪MOT16_Benchmark数据集下载-------------送人玫瑰,手留余香
- 帮宝宝睡得更好、更平稳
- 深度学习准备之Ubuntu下装显卡驱动
- 【Flutter】二十五、Flutter的事件处理
- springBoot使用activeMQ发送消息,错误This class is not trusted to be serialized as ObjectMessage payload.
- 游戏中的优化指的是什么?