标题似乎有些不专业,但是相信好多人都知道是怎么回事,开发中最常见的数据操作就是DataReader=>IList<T> 了,当然使用ORM框架的话就不用为这个烦恼了。在Google上没找到一个完整的解决方案,但是自己总结了网上说的,写了一个还算满意的方案。

通常我们会有一个实体类,这个实体类只有属性与数据库字段对应,例如:

(截图不完整)

如何让DataReader转换呢?我写了一个扩展方法(由于是重构代码),扩展实体类使之增加一个方法

以扩展上图的QuestionAnswerInfo为例:

上图中CreateQusetionAnswerInfo方法之所以能做到通用,也就是说不管查询任意组合的某些字段都能正确赋值关键是IDataRecord的

public static T Field<T>(this IDataRecord record, string fieldName) 的扩展方法,它可以保证没有查询的字段和查询了但是返回时NULL的字段对应实体类的属性

设置为默认值

该方法的实现如下:

public static T Field<T>(this IDataRecord record, string fieldName)        {            T fieldValue = default(T);for (int i = 0; i < record.FieldCount; i++)            {if (string.Equals(record.GetName(i), fieldName,StringComparison.OrdinalIgnoreCase))                {if (record[i] != DBNull.Value)                    {                        fieldValue = (T)record[fieldName];                    }                }            }return fieldValue;        }

呵呵,这个IDataRecord的扩展有点像Linq to DataSet中得到字段值的操作了。另外IDataReader是继承了IDataRecord所以这个扩展方法IDataReader也可以使用。

有个上面的两个扩展方法之后,还需要一个对IDataReader的扩展,代码如下:

public static IEnumerable<T> GetEnumerator<T>(this IDataReader reader,Func<IDataRecord, T> generator)        {while (reader.Read())

yield return generator(reader);        }

实现都很简单,下面看看如何使用(代码片段):

using (IDataReader dr = _db.ExecuteReader(command)){    questionAnswerList = dr.GetEnumerator<QuestionAnswerInfo>(new QuestionAnswerInfo().CreateQuestionAnswerInfo).ToList();}

使用时注意:一定要注意Select语句中查询字段名称一定要和对用实体类的属性名称一样。

补充:图2中QuestionAnswerInfo实体类的扩展CreateQuestionAnswerInfo方法的实现书写起来也是比较费事,可以自己写一个代码生成的方法生产代码

具体到我这里代码如下:

    public string CodeDump<T>()    {string result = string.Empty;        System.Reflection.PropertyInfo[] properties = typeof(T).GetProperties();foreach (System.Reflection.PropertyInfo item in properties)        {            result += string.Format("{0} = record.Field<{1}>(\"{0}\"),", item.Name, item.PropertyType.FullName);        }return result;    }

使用也很简单呀,弄一个aspx页面,在页面上放在一个TextBox控件,Page_Load方法中调用上面的方法给TextBox赋值就可以了

TextBox1.Text = CodeDump<QusetionItemInfo>();然后把TextBox中的值复制过去,编辑器自动帮你排好版了。

转载于:https://www.cnblogs.com/dushouke/archive/2009/08/18/convert-datareader-to-list.html

DataReader转换为List的一种实现相关推荐

  1. pdf转换为html5,PDF转换为HTML5的四种方式

    原标题:PDF转换为HTML5的四种方式 这里有四种方法能让你把一个PDF文件转换为HTML5格式,但选择哪一种方式就取决于你的优先事项.IDR解决方案已经花费超过四年的时间来处理这个问题了.我们发现 ...

  2. 字符串html在线互转,将string 的字符串转换为HTML的两种方法

    将string 的字符串转换为HTML的两种方法 采用jquery对象转换 采用原生javascript中DOMParser的parseFromString方法实现 1.采用jquery实现 var ...

  3. 优酷视频kux格式转换为MP4的两种技巧

    优酷作为老牌的视频站点,每天都有很多人在上面看视频.也有一些朋友会将视频从优酷上下载下来,放到手机上进行观看.可是,如果下载的视频跟手机尺寸不匹配怎么办呢?而且优酷视频只能在优酷上才能够播放,对于那些 ...

  4. 用Excel如何将文本转换为数字的七种方法

    用Excel如何将文本转换为数字的七种方法 当下,很多工作都会用到Excel,下面本文分步介绍了如何将包含文本的Excel单元格转换为包含数字的单元格. 概述: 当导入在另一程序(如 dBASE 或  ...

  5. php 带建数组转字符串,php数组转换为字符串的两种方法详解【附视频】

    本篇文章主要给大家介绍PHP数组转换为字符串的两种方法.(文章末尾附有对应的视频教程) 第一种方法:使用PHP本身的函数implode来直接将数组转换为字符串. 第二种方法:使用循环遍历数组元素拼接成 ...

  6. Java:简述对象转换为字符串的三种方式

    Java:简述对象转换为字符串的三种方式 在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结. 一.(String)强制类型转换 使用 ...

  7. JS中将一个值转换为字符串的3种方法

    1.value.toString() 2."" + value 3.String(value) 第一种方法存在的问题是,它不能把null和undefined转换为字符串.还有第二种 ...

  8. mysql datareader dataset_c# 将数据库返回对象DataReader转换为DataSet的方法分享

    摘要: 下文讲述c#中将对象DataReader转换为DataSet的方法分享,如下所示: 例: 编写一个DataReader转换为DataSet方法 ---编写getDataSet方法 public ...

  9. 「译」在JavaScript中将值转换为字符串的5种方法

    原文: 5 Ways to Convert a Value to String in JavaScript 如果您关注Airbnb的样式指南,首选方法是使用"String()"? ...

最新文章

  1. JAVA入门[4]-IntelliJ IDEA配置Tomcat
  2. R语言glmnet交叉验证选择(alpha、lambda)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值、模型最优的lambda值,最终模型的拟合与评估
  3. vins中imu融合_双目版 VINS 项目发布,小觅双目摄像头作为双目惯导相机被推荐...
  4. 17、MySQL函数简介
  5. Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流
  6. 发布一个biztalk 解析Excel文件到xml消息的管道组件
  7. mysql gui 有哪些_推荐五款较好的MySQLGUI工具
  8. 加密 lua_三、Lua相关知识
  9. 读后感:软件测试经验与教训
  10. ezcad旋转轴标刻参数_激光打标机软件ezcad中菜单下的旋转角度标刻2功能介绍及其操作设置...
  11. 使用 Calibre Web 搭建私人电子图书馆
  12. maya如何查看资源大纲_干货|Maya入门到精通完全自学教程大纲(建模篇)
  13. 红米1s 一键root测试
  14. AI量化交易=交易接口+L2行情数据接口+A股策略
  15. 反向代理服务器nginx
  16. 什么样的鞋影响骨骼生长
  17. win10 提升来宾账户为管理员账户
  18. 全球及中国双向可控硅输出光耦行业发展现状及项目战略规划分析报告2021-2027年版
  19. 编程珠玑番外篇之番外篇-O 中间语言和虚拟机漫谈(ZZ)
  20. kurento服务器搭建(docker方式)

热门文章

  1. Object型转list,jsonObject型转list方法,亲测可用
  2. 如何将qq客服搬到我们的flex应用中
  3. 服务器电源输出电压稳定,服务器电源选购指南
  4. php 8发布,PHP 8.0.0 正式版发布啦,一个崭新时代来临!
  5. php中connect,PHP中的ftp_connect()函数
  6. type python django models_Django 模型
  7. python安装方法mac_在Mac上删除自己安装的Python方法
  8. oracle的分支语句,Oracle中的分支语句
  9. 数据可视化——利用pandas和seaborn绘图基础
  10. Robot Motion(模拟题bfs)