2009-09-24 35 views
1

我有我们说的成千上万的Customer记录,我必须在网络表单上显示它们。另外,我有一个CustomerEntity它有10个属性。因此,当我使用DataReader获取数据并将其转换为List<CustomerEntity>时,我需要循环两次数据。建议使用泛型来处理大量数据吗?

那么在这种情况下可以使用泛型?如果是,那么我的应用程序的性能如何?

例如,

在CustomerEntity类中,我有CustomerId & CustomerName propeties。而且我从客户表 得到100条记录那么对于准备名单我已经写了下面的代码

while (dr.Read()) 
    { 
     // creation of new object of customerEntity 
     // code for getting properties of CustomerEntity 
     for (var index = 0; index < MyProperties.Count; index++) 
     { 
     MyProperty.setValue(CustEntityObject,dr.GetValue(index)); 
     } 
     //adding CustEntity object to List<CustomerEntity> 
    } 

我怎样才能避免这两个循环。他们的任何其他机制?

+0

更新了我的回答,以反映额外信息 – 2009-09-24 15:30:18

回答

9

我不太确定泛型如何与数据量绑定;他们是无关的概念...它也不是很清楚为什么这需要你读两次。但是:是的,仿制药在批量使用时很好(为什么它们不是?)。但是,当然,找到问题的最佳方法是分析(服务器性能或带宽 - 在这种情况下可能更多)。

当然,更好的方法是:不要在Web表单上显示数千条记录;用户会怎么做?使用分页,搜索,过滤,ajax等 - 每一个可以想象的技巧 - 但不要将数千条记录发送到客户端。


重新更新的问题;设置属性的循环不一定是坏的。这是一个完全合适的内部循环。在做任何事之前,配置文件看看这是否是实际上是的一个问题。我怀疑纯粹的带宽(服务器和客户端之间,还是服务器和数据库之间)是最大的问题。如果你能证明这个循环是一个问题,有事情可以做,做优化:

  • 开关使用PropertyDescriptor(而不是PropertyInfo),并用HyperDescriptor,使其快了很多
  • 写与DynamicMethod代码做的工作 - 需要IL有一些了解,但速度非常快
  • 写一个.NET 3.5/LINQ Expression做同样的,用.Compile() - 就像第二个点,但(IMO)有点容易

我可以为第一个和第三个项目符号添加示例;我不真的想写第二个例子,只是因为我不会写这个代码我自己更多(我会使用第三个选项,如果可用,否则第一)。

+1

+1。我记得一个客户端需求,它希望显示从搜索返回的所有记录......直到它被指出“最终用户将使用几百万行!!(不必介意服务器上的负载)” – 2009-09-24 11:50:39

+0

在Datareader中,我需要循环两次,因为一个循环用于实际记录,另一个循环用于没有属性。此循环用于将datareader的值设置为List 。 第二点是可接受的,我可以减少记录,但我怎样才能避免循环? 感谢您的快速回复。 – Laxman 2009-09-24 11:53:21

+0

@拉克曼 - 你的意思是有多少物业有价值? – 2009-09-24 12:03:26

0

这是很难说什么样的表现会,但考虑到这些东西 -

  1. 泛型提供了类型的安全性

  2. 如果你打算在页面中显示10000条记录,您的应用程序可能无法使用。如果记录正在分页,请考虑只返回您所在页面实际需要的记录。

  3. 您不应该需要循环两次数据。你在做什么数据?