类的扩展之 DataReader的扩展
看了关于DataReader的扩展,发现能节省很多代码。从数据库读取数据最原始方法就是while()然后做循环,如果数据库添加一个字段那么你所有读取数据库的方法全部添加。通过扩展这个类就摆脱了这种令人恶心的方式,关于效率我进行测试,当读取不多的时候效率相差不大,当读取几十万条而至数百万的时候可能效率就不如手写这种普通的方式,大家如果有兴趣可以自己去测试。好了,开始写
我先贴一张比较难看的图

但是这就是转换的一个过程:我贴代码
1:
/// <summary>
/// 将数据转换为实体集合
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="dr">DbDataReader对象</param>
/// <returns>实体集合</returns>
/// <remarks></remarks>
public static List<T> ToEntitys<T>(this IDataReader dr) where T : new()
{
if (dr == null) return null;
var type = typeof(T);//获取实体类型
var hs = new Hashtable();//目的存所有实体的属性
var propts = type.GetProperties();//获取所有实体属性
foreach (var info in propts)//存入hash表中
{
hs[info.Name.ToUpper()] = info;
}
var entitys = new List<T>();
while (dr.Read())
{
var t = new T();
for (var index = ; index < dr.FieldCount; index++)
{
var info = (PropertyInfo) hs[dr.GetName(index).ToUpper()];//从dr中读取字段,然后看hash表中是否存在此属性
if ((info == null) || !info.CanWrite) continue;//如果没有或者不可写则继续
var data = dr.GetValue(index);//获取属性值
var dType = data.GetType();//获取属性类型
if (dType == typeof (Guid))
info.SetValue(t, data == DBNull.Value ? null : data.ToString(), null);//把Guid转换成string
else
info.SetValue(t, data == DBNull.Value ? null : data, null);
}
entitys.Add(t);
}
dr.Close();//关闭流
return entitys;
}
注释1:this就表示扩展这个类(我的理解)
注释2:SetValue() 这个就是填充值的。t是我们的实体类,data是属性值,通过这种方式把值赋给类对应的属性(映射)比喻一个实体类User的一个属性Name,然后dr读取数据库对象也存在Name这样一来就对应上了,然后在进行赋值。
2:进行测试
第一步:我插入数据库14万条数据
第二步:用普通方式读取10条
/// <summary>
/// 常规读取数据库
/// </summary>
[Test]
public void CommonReadTest()
{
string StrSql = "select top 10 * from DataReaderDB";
SqlDataReader reader = DbHelperSQL.ExecuteReader("", CommandType.Text, StrSql, null);
List<UserInfo> userInfos=new List<UserInfo>();
while (reader.Read())
{
UserInfo user =new UserInfo();
user.Id = reader["Id"].ToString();
int age = ;
user.Age = int.TryParse(reader["Age"].ToString(), out age) ? age : ;
user.Name = reader["Name"].ToString();
user.Title = reader["Title"].ToString();
user.RealName = reader["RealName"].ToString();
user.DContent = reader["DContent"].ToString();
user.Systime = DateTime.Parse(reader["Systime"].ToString());
userInfos.Add(user);
}
Assert.AreEqual(, userInfos.Count);
}
运行速度(第一次由于加载导致慢。所以我选取的不是第一次,你可以多测几次)

第三步:扩展方式读取10条
/// <summary>
/// 扩展流读取数据库
/// </summary>
[Test]
public void ExtensionReadTest()
{
string StrSql = "select top 10 * from DataReaderDB";
SqlDataReader reader = DbHelperSQL.ExecuteReader("", CommandType.Text, StrSql, null);
List<UserInfo> userInfos = reader.ToEntitys<UserInfo>();
Assert.AreEqual(, userInfos.Count);
}

第四步:普通方式读取14万条(只贴效果图)

第五步:扩展方式读取14万条

总结:从中我们可以看出当数据量越来越大的时候扩展就相对来说慢些,当时数量不大两者相差不大,反而扩展更快,也许我测的不准,可以自己测试(注意第一次加载可能导致慢一定多测试几次),我个人觉得如果不是太考虑效率应该用扩展,因为便于项目的维护(最后注意数据库字段和实体类属性记得保持一致)
类的扩展之 DataReader的扩展的更多相关文章
- Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”
标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...
- 面向接口可扩展框架之“Mvc扩展框架及DI”
面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把 ...
- JS扩展 或 Jquery的扩展写法
<script>//JS扩展String函数test,其它类推String.prototype.test = function(s){ alert(this+s);}var str = ' ...
- C#扩展(2):Random的扩展
在.net中关于Random一共也只有这几个方法 // // 摘要: // 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. [ComVisible(true)] public ...
- PHP扩展迁移为PHP7扩展兼容性问题记录
PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容.有不少方法参数做了调整.下面是在迁移过程中遇到的一些问题.记录下来,避免大家再踩坑. add_assoc_string ...
- Solon详解(六)- Solon的校验扩展框架使用与扩展
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- win10 64位安装memcache扩展和开启redis扩展
前面有关于win10下搭建wamp环境的介绍,在此不在赘述,php操作memcache有memcache库和memcached库,其中memcache是php内置的扩展库,支持面向对象和面向过程两种操 ...
- PHP5不重新编译,如何安装自带的未安装过的扩展,如soap扩展?
在虚拟机的CentOS5.5中,一键安装了PHP运行环境,但发现并没有 soap 扩展,而近期项目用需要用到 webservice. 上述的一键安装(lamp0.4),其实是源码编译安装,PHP配置文 ...
- PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看
catalogue . 编译PHP源码 . 扩展结构.优缺点 . 使用PHP原生扩展框架wizard ext_skel编写扩展 . 编译安装VLD . Debug调试VLD . VLD源码分析 . 嵌 ...
随机推荐
- [Python 多线程] RLock可重入锁 (九)
RLock 可重复锁,是线程相关的锁.同样是线程相关的还有threading.local. 线程A获得可重用锁,并可以多次成功获取,不会阻塞.最后要再线程A中和acquire次数相同的release. ...
- CodeForces - 999D Equalize the Remainders (模拟+set)
You are given an array consisting of nn integers a1,a2,…,ana1,a2,…,an , and a positive integer mm . ...
- 学习VCL之路(1)
在TObject类中,有一个Dispatch()方法和一个DefaultHandler()方法,它们都是与消息分发机制相关的. Dispatch()负责将特定的消息分发给合适的消息处理函数.首先它会在 ...
- LeetCode29.两数相除 JavaScript
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- iOS 百度地图判断用户是否拖动地图的检测方法
前言:百度地图API并没有提供移动地图时的回调接口 实现:通过判断当前地图的中心位置是否为用户位置来判断,代码如下 -(void)mapView:(BMKMapView *)mapView regio ...
- NSDate|NSTimeZone|时区|日历
NSDate,NSDateFormatter以及时区转换-开发者-51CTO博客 iOS 时区转换 东八区 - 简书 iOS时间的时区转换以及一些方法记录 - 简书 iOS - OC NSTimeZo ...
- vrrp_script不起作用解决方案
我这里主要是因为windows转码造成的:将可执行的check_nginx.sh检测脚本内容复制到U盘,然后插入内网windows,将内容用nodepad++打开,复制,粘贴到服务器的check_ng ...
- jqGrid 分页
这两天一直在搞jqGrid分页,焦头烂额,不过还是有点收获的(主要是后台分页): jqGrid分页可以分为两种,远程数据(服务器数据)分页和本地数据分页, 先看远程数据分页: $(&q ...
- 初次使用vue-cli3 来搭建项目
1,细数项目中使用的技术:vue, vue-router, vuex ,axios,vue-cli3, 快速建站. 2,mock技术使用的express-mockjs . 由于cli3 最新版的话缺少 ...
- 【8086汇编-Day1】预备知识
菜鸟的8086汇编入门之旅,偶有错处恭请大佬们指正. Ⅰ· 闲说一下 我为什么学汇编?相对于晦涩难懂的01010101011010机器语言(高低电平变化驱动机器做出不同反应),汇编语言用更便于记忆和使 ...