繁体   English   中英

从数据读取器填充对象

[英]Filling object from a datareader

采访中有人问我一个问题。 您如何用数据读取器返回的数据填充自定义对象。

我的答案是使用datareader.read(),创建自定义对象的实例并使用datareader值设置属性。

面试官不满意。 他说,如果我有数百万条记录,那么使用我的方法来填充这些记录将非常缓慢。 他要求我提出另一种方法。

除此之外,还有其他方法吗? 请评论。

您的方法是完全有效的,并已在许多地方使用。 现在,如果您有数百万条记录,您可能将始终不希望填充内存中的对象。 但是我想这将取决于您将如何处理该对象。 如果访问者说他不想循环这些记录,那么这将违背数据读取器的目的。

您是否建议将业务对象存储在某种内存数据结构中? 如果是这样,面试官也许对解决方案感兴趣,在该解决方案中,对象可以在生成器方法中实例化,然后使用yield return返回给消费者。

这实际上取决于场景-那里没有足够的要求,但是有一些想法:

  • 迭代器块( yield return )避免了必须缓冲所有数据
  • 如果您为每种类型编写特定的C#代码,那很好-但是如果性能很关键,则不应该使用(原始)反射; 动态方法( ILGenerator等,或Expression ),或诸如HyperDescriptor之类的东西可以消除反射
  • 如果他们想要一个集合,则集合本身可能会在您消耗它时被延迟加载,但是除非您的TSQL首先返回此Count ,否则您将无法提前获取Count
  • 他可能在争辩说构造函数可能比使用单个属性更快,但是坦率地说,我怀疑他没有对此进行概要分析。 有很少会设置属性之间这里显著差异VS字段(构造函数内)。 实际上,我正在撰写有关该主题的博客文章。

我对这个问题的立即回答是:“如何用DataReader返回的数据填充自定义对象?” 是“通过使用合成”。 显然,面试官以为他在问一个不同且有趣得多的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM