【问题标题】:How to insert large number of rows from a datatable to a list in C#如何将大量行从数据表插入C#中的列表
【发布时间】:2020-01-14 23:54:45
【问题描述】:

我在 C# 中有一个数据表,其中包含大约 8-10k 行。

我需要将这些行插入到对象列表中。现在我正在一个一个地做,但显然插入和显示需要很长时间。

是否有可能以更快的方式做到这一点?

var resultList = aggResults.ExtractRows(row => new ActivitySummaryGrouped
{
    TimeSlot = row.Field<DateTime>("timestamp").ConvertUtcTimeToMountainTime(),
    Product = row.ExtractItemOrDefault(QueryField.Product.ToString(), product),
    Client = row.ExtractItemOrDefault(QueryField.Client.ToString(), client),
    Host = row.ExtractItemOrDefault(QueryField.Host.ToString(), host)

});

没有错误,但是将大量数据从 Datatable 插入到 List 需要很长时间。

我们没有使用实体框架。我们正在从弹性搜索中获取数据。 我可以实现分页来显示数据,但由于我们需要计算存在的数据行总数的平均值、总计和其他计算等,所以我不能使用相同的方法。 ExtractRows 是一个扩展方法,看起来像这样:

public static List<T> ExtractRows<T>(this DataTable data, Func<DataRow, T> fieldExtractor)
{
   var resultIterator = data.AsEnumerable();
   return resultIterator.Select(fieldExtractor).ToList();
}

前端是 Angular JS,我们在网格中显示数据。

【问题讨论】:

  • 通常这可以通过分页结果来解决。在这里,您有数百万个问题,但由于相同的原因(性能),您每页只会看到 15/30/50(您的选择)
  • 你有实体框架吗?除了这种方式,您究竟是如何连接到数据库的?
  • ExtractRowsExtractItemOrDefault 是你写的扩展方法吗?我问这个是因为您可能正在对数据集进行多次枚举。您应该显示其余代码。你如何填写 aggResults 以及 ExtractRows 正在做什么,如果你写的话。
  • 我已经更新了我的问题。请看一看。
  • 您的目标是什么:Winforms、WPF、ASP..?您应该始终正确标记您的问题,以便人们可以在问题页面上看到它! - 你不应该显示 10k 行!与显示分开进行所有计算!需要时间的是显示部分!另外:你在哪里显示数据??

标签: c# asp.net asp.net-mvc list datatable


【解决方案1】:

还有另一种方式,我们称之为 ADO.NET 的非连接架构。我们使用的是DataReader,而不是DataAdapter。当拉出你的对象一次然后你存储在一个 Javascript 对象中。此外,您可以使用 JQuery 库在 javascript 对象中填充数据流。

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 2018-05-20
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多