看了关于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的扩展的更多相关文章

  1. Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”

    标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...

  2. 面向接口可扩展框架之“Mvc扩展框架及DI”

    面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把 ...

  3. JS扩展 或 Jquery的扩展写法

    <script>//JS扩展String函数test,其它类推String.prototype.test = function(s){ alert(this+s);}var str = ' ...

  4. C#扩展(2):Random的扩展

    在.net中关于Random一共也只有这几个方法 // // 摘要: // 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. [ComVisible(true)] public ...

  5. PHP扩展迁移为PHP7扩展兼容性问题记录

    PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容.有不少方法参数做了调整.下面是在迁移过程中遇到的一些问题.记录下来,避免大家再踩坑. add_assoc_string ...

  6. Solon详解(六)- Solon的校验扩展框架使用与扩展

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  7. win10 64位安装memcache扩展和开启redis扩展

    前面有关于win10下搭建wamp环境的介绍,在此不在赘述,php操作memcache有memcache库和memcached库,其中memcache是php内置的扩展库,支持面向对象和面向过程两种操 ...

  8. PHP5不重新编译,如何安装自带的未安装过的扩展,如soap扩展?

    在虚拟机的CentOS5.5中,一键安装了PHP运行环境,但发现并没有 soap 扩展,而近期项目用需要用到 webservice. 上述的一键安装(lamp0.4),其实是源码编译安装,PHP配置文 ...

  9. PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看

    catalogue . 编译PHP源码 . 扩展结构.优缺点 . 使用PHP原生扩展框架wizard ext_skel编写扩展 . 编译安装VLD . Debug调试VLD . VLD源码分析 . 嵌 ...

随机推荐

  1. 【nodejs】学习笔记

    学习链接:http://www.cnblogs.com/zhongweiv/p/nodejs_environment.html (一)简介及环境安装 Node.js是让Javascript脱离浏览器运 ...

  2. appium ios Demo

    Appium Demo 录制图片,环境搭建完毕后根据视频基本能利用模拟器完成简单测试用例 感谢大神http://www.cnblogs.com/tobecrazy/p/4970188.html

  3. 关于selenium获取token sessionid

    # 获取sessionid def get_sessionid(self): # 是要从localStorage中获取还是要从sessionStorage中获取,具体看目标系统存到哪个中 # wind ...

  4. Linux下jmap命令查看内存使用

    Linux下jmap命令查看内存使用 jmap -heap 1234(1234为进程号) jmap是JDK自带的一个工具,非常小巧方便,其支持参数如下: -heap       打印heap空间的概要 ...

  5. css z-index之object flash层级问题

    <object type="application/x-shockwave-flash" data="flash文件路径" style="z-i ...

  6. SQL循环插入批量数据

    declare @i intdeclare @qid int set @i=1set @qid=100 while @i<50000begininsert into Order(orderid, ...

  7. C++多态之虚函数

    多态:不同对象收到相同消息时,产生不同的动作.(说通俗点就相当于,在一工地上有许多工人,每个工人负责的工作都不一样,但是他们在听到领班发出“开工”命令后,开始各自负责的工作). 在c++中实现多态,我 ...

  8. Qt5显示中文字符

    在cpp文件或.h文件中顶行输入: #pragma execution_character_set("utf-8")

  9. less使用

    Less在浏览器上使用的方法 <link rel="stylesheet" type="text/less" href="styles.less ...

  10. MySQL安装及配置

    MySQL安装 我是在Windows上安装的MySQL.首先登录MySQL的官网下载安装包. 最后献上5.5.28这个服务器的下载连接地址: http://cdn.mysql.com/Download ...