如何高效的将 DataReader 转成 ListT ?

咨询区

  • Anthony

我在使用第三方工具包,它返回了一个 DataReader,为了能更方便的使用,我希望有一种快捷方法能够将它转成 List<T>,除了一行一行的迭代赋值之外还有其他好的方式吗?

回答区

  • pim

可以用反射实现,虽然性能低一点,但它可以帮你自动化的将 DataReader 映射到 List<T> 上,这里的 T 可以是你的任意类型,参考如下代码:

public static class DataRecordHelper
{public static void CreateRecord<T>(IDataRecord record, T myClass){PropertyInfo[] propertyInfos = typeof(T).GetProperties();for (int i = 0; i < record.FieldCount; i++){foreach (PropertyInfo propertyInfo in propertyInfos){if (propertyInfo.Name == record.GetName(i)){propertyInfo.SetValue(myClass, Convert.ChangeType(record.GetValue(i), record.GetFieldType(i)), null);break;}}}}
}public class Employee
{public int Id { get; set; }public string LastName { get; set; }public DateTime? BirthDate { get; set; }public static IDataReader GetEmployeesReader(){SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);conn.Open();using (SqlCommand cmd = new SqlCommand("SELECT EmployeeID As Id, LastName, BirthDate FROM Employees")){cmd.Connection = conn;return cmd.ExecuteReader(CommandBehavior.CloseConnection);}}public static IEnumerable GetEmployees(){IDataReader rdr = GetEmployeesReader();while (rdr.Read()){Employee emp = new Employee();DataRecordHelper.CreateRecord<Employee>(rdr, emp);yield return emp;}}
}
  • Phil Cooper

对于你的需求,建议使用 Dapper 做这种映射,参考如下代码:

public List<CustomerEntity> GetCustomerList()
{using (DbConnection connection = CreateConnection()){return connection.Query<CustomerEntity>("procToReturnCustomers", commandType: CommandType.StoredProcedure).ToList();}
}

CreateConnection() 它用来创建数据库连接,然后 Dapper 内部会通过 ILEmit 的方式实现 DataReader 和 Properties 之间的自动映射,非常方便。

  • Mohsen

我有一个好办法,既不需要引用 ORM 组件,也不需要手工写反射,借助 DataTable 和 JsonConvert 即可, 参考如下代码:

public static void Main(){var dt = new DataTable();dt.Load(yourDataReader);// creates a json array of objectsstring json = Newtonsoft.Json.JsonConvert.SerializeObject(dt);// this is what you're looking for right??List<YourEntityType> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<YourEntityType>>(json);}

点评区

我个人在开发中,数据库用 Dapper ,DTO之间用 AutoMapper,非常方便,大家可以参考参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之如何成为Android高手

成为Android高手一般分为六个阶段&#xff1a; 第一阶段&#xff1a;熟练掌握Java SE&#xff0c;尤其是对其内部类、线程、并发、网络编程等需要深入研究&#xff1b;熟练掌握基于HTTP协议的编程&#xff0c;清楚POST和GET等请求方式流程和细节&#xff1b;能够进行基本的Java…

java foreach 跳过本次循环_【Java】对foreach循环的思考

阿里java开发手册已经发表&#xff0c;很多都值得认真研究思考&#xff0c;看到零度的思考题&#xff0c;没忍住研究了一下。在这里插入图片描述首先&#xff0c;看一下给出的反例的执行结果。如果是"1"&#xff0c;最后list中的元素为["2"]如果把"1&…

地球上这10个奇幻景观,带你踏入外太空

全世界只有3.14 % 的人关注了爆炸吧知识大蓝洞大蓝洞是灯塔礁的一部分&#xff0c;位于洪都拉斯伯利兹城陆地大约100公里之遥&#xff0c;是一个较大的完美环状海洋深洞&#xff0c;是当今世界最吸引人的潜水地点之一。305米的口径&#xff0c;123米的洞深&#xff0c;洞口呈现…

闲谈简单设计(KISS)疑惑

忙碌了一年了项目又到了交付了&#xff0c;虽然项目能成功上线&#xff08;因为还有维护支持的团队&#xff09;。但是个人从技术上看&#xff0c;这是一个不那么成功的项目&#xff0c;因为后期艰难的修复bug,添加feature。这与简单设计有什么关系呢&#xff1f;在某模块开发起…

OSChina 周六乱弹 —— 有人骂你神经病怎么办?

2019独角兽企业重金招聘Python工程师标准>>> 周六了&#xff0c;大家有没有在认真加班呢&#xff1f;其实咱们程序员的生活真的不容易 熊大信了熊二的话&#xff1a;程序员的人生 码代码不容易&#xff0c;咱们还是去抢银行吧 sunny_chan&#xff1a;一天老师让同学…

手把手教你学Dapr - 6. 发布订阅

介绍发布/订阅模式允许微服务使用消息相互通信。生产者或发布者在不知道哪个应用程序将接收它们的情况下向主题发送消息。这涉及将它们写入输入通道。同样&#xff0c;消费者或订阅者订阅该主题并接收其消息&#xff0c;而不知道是什么服务产生了这些消息。这涉及从输出通道接收…

Android之AndroidManifest.xml文件解析和权限集合

一、关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录&#xff0c;描述了package中暴露的组件&#xff08;activities, services, 等等&#xff09;&#xff0c;他们各自的实现类&#xff0c;各种能被处理的数据和启动位置…

mysql许多连接错误而被阻止_怎样解决mysql连接过多的错误?

设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。自己写个脚本检测这类语句&#xff0c;比如order by rand()&#xff0c; 超过一定时间用Kill query thread_id 给杀掉。那能不能不要杀掉而让他正…

直男的浪漫有多可怕?

1 你不说估计没人知道&#xff08;via.信箱说i&#xff09;▼2 举报&#xff0c;此处有个疑似小偷的人&#xff01;&#xff08;via&#xff1a;不知姓名的C&#xff09;▼3 世界上最互相信任的人了吧&#xff1f;▼4 你看我这个垫肩是不是很不错&#xff01;&#xff08;素…

LNMP服务器安装配置(Rhel+Nginx+PHP+MySQL)

1、关闭selinux、配置防火墙&#xff0c;开启80、3306端口[rootlocalhost ~]# cp /etc/sysconfig/iptables /etc/sysconfig/iptablesbak [rootlocalhost ~]# vim /etc/sysconfig/iptables -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j…

第2课:关闭被黑客扫描的端口

端口定义&#xff1a;计算机与外界通讯交流的出口。netstat -an&#xff1a;查看本机开启的端口。1521 -->oracle端口3306 -->mysql端口1433 -->mssql端口5631 -->pcanywhere端口&#xff0c;它是一款远程控制软件 通过注册表编辑器来关闭445、135、139、3389端口&…

飞了,飞了,真的疯了

她走了&#xff0c;真的走了&#xff0c;不留下一片红唇&#xff0c;溜溜的走了&#xff0c;消失了&#xff0c;此生再无相见。转载于:https://blog.51cto.com/plusqueen/883628

WPF 透明窗口在桌面上放虫子。。。

抖音上偶然看到这个&#xff0c;咱也想来一个&#xff0c;看看效果&#xff1a;实现很简单&#xff0c;一个透明窗口&#xff0c;一个gif图片&#xff0c;不显示任务栏&#xff0c;再加上鼠标穿透&#xff0c;就ok了了看看代码&#xff1a;Mainwindow.xaml:<Window x:Class&…

Android之图片缓存管理

如果每次加载同一张图片都要从网络获取&#xff0c;那代价实在太大了。所以同一张图片只要从网络获取一次就够了&#xff0c;然后在本地缓存起来&#xff0c;之后加载同一张图片时就从缓存中加载就可以了。从内存缓存读取图片是最快的&#xff0c;但是因为内存容量有限&#xf…

mysql 非空语法_mysql从入门到优化(1)基本操作上

这是数据库系列的第一篇文章&#xff0c;主要是对mysql的基本操作有一个了解。本系列的教程会先从基础出发&#xff0c;逐步过渡到优化。一、前提在这里我们不会从如何去安装数据库开始讲起&#xff0c;而是在安装完之后从操作数据库开始&#xff0c;文中所有的代码均在我自己的…

“凡尔赛文学”疯狂刷屏!数学家们也拼命“装”了起来,哈哈哈哈哈

全世界只有3.14 % 的人关注了爆炸吧知识凡尔赛文学与数学结合起来完美无缺大家好&#xff0c;超模君昨天在写稿时&#xff0c;表妹过来告诉我&#xff1a;“表哥你的科普文章都out了&#xff01;现在凡尔赛文学才是主流&#xff01;”超模君很疑惑&#xff0c;凡尔赛文学的画风…

org.hibernate.InvalidMappingException: Could not parse mapping document from resource

在写hibernate时&#xff0c;若运行出现"org.hibernate.InvalidMappingException: Could not parse mapping document from resource"问题&#xff0c;首先确定jar包导入无误; 接下来看 *.hbm.xml文件中的字段&#xff1a; <!DOCTYPE hibernate-mapping PUBLIC &q…

.NET 6新特性试用 | 可空引用类型

前言在查看《隐式using指令》功能时&#xff0c;我们在csproj中发现这样一个属性&#xff1a;那么&#xff0c;Nullable到底是干嘛的&#xff1f;可为空上下文严格来说&#xff0c;这不是新特性&#xff0c;而是C# 8.0引入的特性之一。该特性用于指示引用类型是否接受null值:只…

zabbix JMX监控 tomcat

第一步&#xff1a;需要安装jdk1.# tar xvf jdk-7u21-linux-x64.tar.gz -C /usr/localource /etc/bashrc2.# ln -s /usr/local/jdk1.7.0_21 /usr/local/jdk3.# echo JAVA_HOME/usr/local/jdk >> /etc/bashrc4.# echo PATH$PATH:${JAVA_HOME}/bin/ >> /etc/bashrc5.…

Android之Base64

Base64介绍 Base64是一种基于64个可打印字符来表示二进制数据的表示方法,从本质上看Base64编码就是将三字节转四字节。如将字符串“Man”用Base64编码。 如果数据的长度不是3的整数倍