这个问题在这里已经有答案了:
改进数据访问层选择方法模式(7个答案)
将数据读取器中的行转换为键入的结果(10个答案)
7年前关门了。
我有一个数据库里的数据 DataReader
我想把它转换成 List<T>
. 有什么可能的简单解决方案?
例如,在customerentity类中,我有customerid和customername属性。如果我的datareader将这两列作为数据返回,那么如何将其转换为 List<CustomerEntity>
.
这个问题在这里已经有答案了:
改进数据访问层选择方法模式(7个答案)
将数据读取器中的行转换为键入的结果(10个答案)
7年前关门了。
我有一个数据库里的数据 DataReader
我想把它转换成 List<T>
. 有什么可能的简单解决方案?
例如,在customerentity类中,我有customerid和customername属性。如果我的datareader将这两列作为数据返回,那么如何将其转换为 List<CustomerEntity>
.
9条答案
按热度按时间ax6ht2ek1#
我在一个宠物项目中谈到了这一点。。你想用什么就用什么。
注意,listex实现了idatareader接口。
或者像下面的例子一样使用对象Map。
看一看http://caprisoft.codeplex.com
xsuvu9jc2#
您不能简单地(直接地)将datareader转换为list。
您必须遍历datareader中的所有元素并插入到列表中
在示例代码下面
daolsyd03#
我知道这个问题很老,而且已经回答了,但是。。。
既然sqldatareader已经实现了ienumerable,为什么需要在记录上创建一个循环?
我一直在使用下面的方法,没有任何问题,也没有任何性能问题:到目前为止,我已经用ilist、list(of t)、ienumerable、ienumerable(of t)、iqueryable和iqueryable(of t)进行了测试
强类型类
使用
llmtgqce4#
我用这个例子写了下面的方法。
首先,添加命名空间:
System.Reflection
例如:T
是返回类型(classname)和dr
是Map的参数DataReader
c#,调用如下Map方法:这是Map方法:
vb.net,调用Map方法如下:
这是Map方法:
nr7wwzry5#
我见过使用反射和属性或字段属性将数据读取器Map到对象的系统(有点像linqtosql。)它们节省了一点键入时间,并且在为dbnull等编码时可能减少错误的数量。一旦缓存生成的代码,它们也可以比大多数手写代码更快,因此如果您经常这样做,请考虑“高速路”。
请参阅“在.net中对反射的防御”以获取此示例。
然后您可以编写如下代码
...
(automap(),是一个扩展方法)
@斯蒂尔加,谢谢你的评论
如果你有能力,你可能会更好地使用nhibernate,ef或linqtosql等,但是在旧的项目上(或由于其他(有时是有效的)原因,例如“不是在这里发明的”,“对存储过程的热爱”等),它并不总是可能使用orm,所以一个更轻的系统可以有助于“袖手旁观”
如果您需要编写大量的idatareader循环,那么您将看到减少编码(和错误)的好处,而不必更改正在处理的系统的体系结构。这并不是说这是一个好的架构开始。。
我假设customerdto不会离开数据访问层,复合对象等将由数据访问层使用dto对象构建。
几年后,我写了这个答案潇洒进入世界的.net,它很可能是一个非常好的起点,为编写你的onw汽车,也许它会完全消除你这样做的需要。
plupiseo6#
最简单的解决方案:
lh80um4z7#
我会(而且已经)开始使用整洁。使用您的示例将类似于(从内存中编写):
62o28rlo8#
很明显
@Ian Ringrose
的中心论点,你应该使用一个库,这是最好的单一答案在这里(因此a+1),但对于最小的一次性或演示代码,这里是一个具体的例子@SLaks
的微妙评论@Jon Skeet
更精细的(+1'd)答案:如在
@Jon Skeet
答案是位可以提取到助手中(我喜欢将它们转储到查询类中):
用作:
更新3月9日至13日:还请参阅一些优秀的更精细的编码技术,以分割出这个答案中的样板文件
igetnqfo9#
我建议为此编写一个扩展方法:
你就可以用林克的
ToList()
方法将其转换为List<T>
如果你愿意,像这样:我真的建议
FromDataReader
中的方法Customer
(或其他地方):这将留下:
(我认为类型推断在这种情况下不起作用,但我可能错了……)