Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据读取器填充对象_C# - Fatal编程技术网

C# 从数据读取器填充对象

C# 从数据读取器填充对象,c#,C#,我在面试中被问到一个问题。如何使用从datareader返回的数据填充自定义对象 我的答案是使用datareader.read(),创建自定义对象的实例并使用datareader值设置属性 面试官不高兴。他说,如果我有数百万条记录,那么用我的方法填充这些记录将非常缓慢。他让我提出另一种方法 除了这个,还有别的办法吗。请评论。您的方法非常有效,并在许多地方使用。现在,如果您有数百万条记录,您可能无论如何都不会喜欢填充内存中的对象。但我想这将取决于你将如何处理这个物体。如果面试官说他不想循环这些记录

我在面试中被问到一个问题。如何使用从datareader返回的数据填充自定义对象

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

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


除了这个,还有别的办法吗。请评论。

您的方法非常有效,并在许多地方使用。现在,如果您有数百万条记录,您可能无论如何都不会喜欢填充内存中的对象。但我想这将取决于你将如何处理这个物体。如果面试官说他不想循环这些记录,那么这就违背了数据阅读器的目的。

您是否建议将业务对象存储在某种内存数据结构中?如果是这样的话,面试官可能对一个解决方案感兴趣,在这个解决方案中,对象在生成器方法中实例化,并使用
收益返回

返回给消费者。这实际上取决于场景-那里没有足够的需求,但有一些想法:

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

我对这个问题的直接回答是,“如何用
数据读取器返回的数据填充自定义对象?”是“通过使用合成”。显然,面试官认为他问的是一个不同的、不太有趣的问题。

为什么你会要求数百万行?如果您想计算一些聚合值,您应该让服务器来做这项工作,然后只返回结果。如果需要向用户显示数百万行,则应使用分页并仅获取需要显示的行。面试官是否解释了他为什么需要拍数百万行?你问过他这件事吗?他说他不想循环这些记录。>如果你有数百万条记录,你可能不会。。。我同意!如果你说有数千条记录,那么我更喜欢使用DataAdapter.Fill()而不是datareader。我个人也喜欢强类型数据集,甚至这些ORM解决方案:使用DataAdapter的一般优势是什么?DataAdapter只是在后台使用DataReader。输出必须是包含所有这些值的集合。可以使用yield return吗?通常,您希望尽快关闭与数据库的连接。使用生成器只能增加连接保持打开的时间。但是使用
产生
将使数据连接保持(潜在)长时间打开,这当然是一种折衷-p大量内存与打开的连接。就像我说的,这取决于需求。