看了关于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. jQuery.mobile.changePage的参数

    选项 类型:对象 属性: allowSamePageTransition(默认值:假的) 类型:布尔 默认情况下,changePage()忽略请求更改为当前活动页面.将此选项设置为true,则允许该请 ...

  2. hibernate二级缓存实例

    hibernate.cfg.xml <?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration P ...

  3. Android-应用性能测试

    参考了文章:http://www.cnblogs.com/mliangchen/p/5125114.html 问题一:使用真机在DDMS下,查看不到应用进程,logcat也不全 最后,只能使用Geny ...

  4. vue项目中分享到朋友圈,调用微信接口

    虽然微信提供了jssdk,不代表可以点击按钮进行分享到朋友圈,是需要微信自带的浏览器右上角进行分享.手机浏览器需要浏览器支持分享到朋友圈的分享机制. 微信jssdk地址: https://mp.wei ...

  5. c#网络加密传输

    网上已经有很多测试,我就不多说了.先说说我的测试. 1.net framework 都应该合适. 2.RSACryptoServiceProvider类在.net core 下无法调用xml导出方法( ...

  6. ABAP术语-XML

    XML 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/21/1115743.html The "eXtensible Markup ...

  7. vmware虚拟机下linux centos6.6只有lo,没有eth0网卡、随机分配ip地址,固定ip地址等问题

    这个问题卡了我一天多的时间,百度上搜出来的问题五花八门,反而把我给搞糊涂了.最后总算是实践成功了,记录一下配置的过程. 配置网卡和随机分配ip地址 我安装的是basic server版本,用的是NAT ...

  8. LNMP web服务的安装

    第1章 安装Nginx 环境: 系统:CentOS6.5 软件:nginx-1.6.3     mysql-5.5.49    php-5.5.32 1.1 Nginx官网 http://nginx. ...

  9. rpm与yum,at与crontab,sed命令使用

    1.简述rpm与yum命令的常见选项,并举例. rpm——软件包管理系统,它使得在Linux下安装.升级.删除软件包的工作变得容易,并且具有查询.验证软件包的功能. 1)安装选项 命令格式: rpm ...

  10. sublime text3 插件安装方法

    1.按Ctrl+`(ESC下方的键)调出console粘贴以下代码到底部命令行并回车 2.输入:import urllib.request,os,hashlib; h = '6f4c264a24d93 ...