DataTable与结构不同实体类之间的转换
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了。的确没错,这方法可行,但是这个方法效率极低,遇到亿万数据的话那就要实例化亿万个对象,更要命的是还要对每个对象的字段逐一赋值,由此可见它的效率了。
今天我无意在网上看到了一大牛写的一段代码,让我很感慨,现在我将它记录下来,希望对以后开发过程中有所用。
先看一下我的实体类
- /// <summary>
- /// 具体的实体类,和数据表中不同
- /// </summary>
- public class Person
- {
- [DataField("user_name")]//表示数据库表里面的字段
- public string UserName { set; get; }//表示需要转换成的字段
- [DataField("pass_word")]
- public string PassWord { set; get; }
- }
具体在代码中有注释,下面是转换类
- [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;
- }
- }
调用代码:
- 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);
- }
DataTable与结构不同实体类之间的转换的更多相关文章
- (转)DataTable与结构不同实体类之间的转换
原文地址:http://www.cnblogs.com/kinger906/p/3428855.html 在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我 ...
- DataTable和实体类之间的转换
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...
- java 使用反射在dto和entity 实体类之间进行转换
package com.example.demo.utils; import java.lang.reflect.Method; import java.util.List; import com.e ...
- (转)DATATABLE(DATASET)与实体类之间的互转.
转自:http://www.cnblogs.com/zzyyll2/archive/2010/07/20/1781649.html dataset和实体类 之间的转换 //dataset转实体类 代 ...
- DataReader,DataTable利用泛型填充实体类
using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...
- 实体类与实体DTO类之间的转换
实体类与实体DTO类之间的转换 实体类与实体DTO类之间的转换 1.通过使用第三方序列化反序列化工具Newtonsoft.Json 2.通过反射实现 3.通过表达式目录树加字典缓存实现 4. 通过表达 ...
- XML文件与实体类的互相转换
XML文件与实体类的互相转换 一.将XML文件反序列化为实体类对象 1. 通常程序的配置信息都保存在程序或者网站的专门的配置文件中(App.config/web.config).但是现在为了演示XML ...
- Java基本数据类型、包装类与String类之间的转换
一.基本数据类型与包装类之间的转换: import org.junit.Test; public class MainTest { /** * 基本数据类型与包装类之间的转换 */ @Test pub ...
- C# 实现实体类和Xml转换
一.实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T& ...
随机推荐
- Java 虚拟机-垃圾收集算法
本文主要介绍Java虚拟机的垃圾回收算法. 一.概述 二.标记-清除算法 Mark-Sweep.如同名字,该算法分两步: 标记:标记处需要回收的对象 清除:标记完成后统一回收被标记的对象. 缺点: 效 ...
- 关于app集成支付宝应用内支付的问题总结
pem文件生成,将合作伙伴密钥复制到notepad++中,每45个字符回车,去除空格,头尾加上标题,文件需保存为无BOM的UTF8格式,就OK. 可以每行64个字符,共216个字符. 近来处理了 ...
- javascript中原型学习
学习地址:http://www.cnblogs.com/wangfupeng1988/tag/%E5%8E%9F%E5%9E%8B/
- Memcached数据存储方式
1. memcached的数据存储方式被称为Slab Allocator,其基本方式是: ①:先把内存分成很多Slab,这个大小是预先规定好的,已解决内存碎片的问题.分配给Slab的内存空间被称为Pa ...
- Python时间日期函数讲解
所有日期.时间的api都在datetime模块内. 1. 日期输出格式化 datetime => string import datetime now = datetime.datetime.n ...
- PHP判断当前协议是否为HTTPS
function is_https() { if ( !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'o ...
- git commit 提交的时候,出现*** Please tell me who you are. git config --global 。。。问题
$ git commit -a -m 'v6' *** Please tell me who you are. Run git config --global user.email "you ...
- leetcode696
本题先寻找字符串中0变1,或者1变0的位置作为分隔位置.然后从这个分隔位置同时向左.右两侧搜索. 找到的左连续串和右连续串,都进行累计. public class Solution { public ...
- Java微信公众平台开发(十三)--微信JSSDK中Config配置
转自:http://www.cuiyongzhi.com/post/57.html 前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的.搞前端的甚至是是搞后端 ...
- 12-EasyNetQ之消息版本控制
为了能够支持消息版本控制,你需要确保这个必要的组件已配置.最简单的实现是这样的: var bus = RabbitHutch.CreateBus("host=localhost", ...