【问题标题】:Translating a DataTable into a custom object and vice versa将 DataTable 转换为自定义对象,反之亦然
【发布时间】:2011-09-23 17:13:21
【问题描述】:

我有一个实用程序类,可以将对象转换为 DataTables,反之亦然。从数据表转换为对象列表时,我们在加载大量数据时遇到问题。我们使用自定义属性来确定和关联列信息。这是伪代码:

For each row in the table
    For each property in an object
        For each attribute on that property
            If the attribute is our column information attribute
                Grab the data from the table and insert the value into the objects property
            End
        End
    End
End

但是,对于具有数百行的 DataTable 结果,此过程需要 分钟...这在 Web 应用程序中是不可接受的。

所以,我的问题是:是否有一些简单的方法可以来回转换 DataTable 和 .NET(自定义)数据对象,不需要大量反射(这可能是所有开销都在这案例)?

编辑:原来这是数据对象本身的另一个问题。不过,我确实通过反射调用对加载器进行了一些优化,所以谢谢大家。

【问题讨论】:

  • 也许您应该发布实际代码——您的问题可能是您正在为每一行进行反射调用,而不是缓存其中的一些。有关一些想法,请参阅此问题的答案:stackoverflow.com/questions/1204748/…
  • 查看这篇关于 ValueInjector 作为数据表和对象之间的映射器的帖子:stackoverflow.com/questions/5462671/valueinjecter-and-datatable
  • 我在法律上无法发布代码,但我没有缓存我的反射调用。我现在正在尝试,希望它能加快速度,达到我们可以容忍的页面加载时间。

标签: asp.net reflection datatable


【解决方案1】:

它必须是动态的吗?如果没有,您可以使用 LINQ to DataSets:

from tr in table.AsQueryable()
select new MyObject
{
   A = tr.Field<string>("A"),
   .
   .
}

否则,它必须依赖于反射。确保您没有在循环中获取类型和属性信息,因为这可能需要一些时间。与属性相同:考虑在循环之前构建具有该属性的属性的索引,然后使用此属性名称索引来获取您需要的属性。这样,唯一的体现就是将值设置到对象中。

或者,您可以尝试使用 ASP.NET 中的异步功能来卸载工作,或者考虑使用并行扩展来使用多核处理进行转换。

【讨论】:

  • 是的,不幸的是它必须是动态的......这是一个实用功能,它已被完全抽象出来。
  • 好的,然后将对象上的反射移出循环,并且只执行一次。这是一个好的开始。
  • 是的,我只是这样做了,它加快了相当不错的速度。感谢您的建议。
猜你喜欢
  • 2023-04-03
  • 2015-03-05
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2011-05-10
  • 1970-01-01
  • 2013-04-16
相关资源
最近更新 更多