看了关于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. 绕过disable_functions执行命令实验

    绕过disable_functions执行命令实验 看下disable函数,所有命令函数都被禁用: 编译64位共享库: 命令成功执行: 参考链接: https://www.freebuf.com/ar ...

  2. F、CSL 的神奇序列 【规律】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551/F 题目描述 CSL 有一个神奇的无穷实数序列,他的每一项满足如下关系: 对于任意的正整数 n ,有 n∑k ...

  3. jQuery Mobile中jQuery.mobile.changePage方法使用详解

    jQuery.mobile.changePage方法用的还是很多的.作为一个老手,有必要对jQuery mobile中实用方法做一些总结.系列文章请看jQuery Mobile专栏.jquery.mo ...

  4. 新闻cms管理系统(一) ---- thinkphp框架准备

    1.thinkphp介绍 一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架 MVC:M数据层. V视图层 . C控制层 优点: (1)入手非常快 (2)thinkpjp提供核心内库.文件.函 ...

  5. PAT——1036. 跟奥巴马一起编程

    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正 ...

  6. 如何导出SHP文件中的点坐标?(ArcGIS10)

    行政区域坐标,网上流传较广的版本是包括海域的,假如你仅仅想要把陆地边界绘出,那么怎么办呢? 现在讲一下用arcgis 10从shp线.面文件中获取对应区域的坐标呢?(点图层忽略第一步) 首先用在arc ...

  7. 在Eclipse中执行、配置Hadoop

    版权全部: zhe-jiang.he@hp.com  严禁转载! 1.安装插件 准备程序: eclipse-3.3.2(这个版本号的插件仅仅能用这个版本号的eclipse) hadoop-0.20.2 ...

  8. CCF认证201803-1 跳一跳

    import java.util.Scanner; public class Jump { public static void main(String[] args) { Scanner sc = ...

  9. Java byte数据转换和处理总结

    一.byte和int相互转换的方法 java程序或Android程序的socket数据传输,都是通过byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把 ...

  10. 创建 个人 pod

    创建一个自己的 pod 大致需要以下步骤 创建git repository 编辑.podspec 创建LICENSE(许可证/授权)文件 标记 tag 验证 注册CocoaPods 发布 搜索验证 1 ...