【问题标题】:Efficiently extract a subset of rows from a large DataTable?有效地从大型 DataTable 中提取行的子集?
【发布时间】:2011-08-18 18:10:22
【问题描述】:

以下表为例:

+----+---------+------------+
|身份证 |组ID |其他数据 |
+----+---------+------------+
| 1 | 1 | w4ij6u |
+----+---------+------------+
| 2 | 2 | ai6465 |
+----+---------+------------+
| 3 | 2 | ows64rg |
+----+---------+------------+
| 4 | 2 | wqoi46suj |
+----+---------+------------+
| 5 | 3 | w9rthzv |
+----+---------+------------+
| 6 | 3 | 03hsat |
+----+---------+------------+
| 7 | 4 | w469ia |
+----+---------+------------+
| 8 | 5 | nhwh57rt |
+----+---------+------------+
| 9 | 5 | mwitgjhx4 |
+----+---------+------------+

如何有效地从该表中提取基于“GroupID”列的List<List<DataRow>>

基本上,我希望结果是:

MyList(0) = List: 1 DataRow, ID(s) 1
MyList(1) = List: 3 DataRows, ID(s) 2,3,4
MyList(2) = List: 2 DataRows, ID(s) 5,6
MyList(3) = List: 1 DataRow, ID(s) 7
MyList(4) = List: 2 DataRows, ID(s) 8,9

但问题是:这个 DataTable 包含数百列和数万行,所以这个操作必须尽可能高效。

我已经尝试过以下方法:

  • 使用行过滤器创建DataView,并从该视图中提取表/行列表。
  • 在获得唯一的 GroupID 列表后,循环内的 Linq 查询。 Linq 查询根据Where 子句选择每个“组”组ID。

我希望其他人有更好、更有效的方法来提取这些数据。

【问题讨论】:

    标签: .net datatable performance


    【解决方案1】:

    您是否尝试过 DataTable.Select() 方法?这是一个如何使用它的示例:

    DataTable table = GetSomeData();
    DataRow[] results = table.Select("SomeInt > 0");
    
    List<DataRow> resultList = results.ToList();
    

    使用 DataTable.Select 肯定比 DefaultView.Filter 更快,并且您可以看到将结果放入列表的功能已经内置。

    【讨论】:

    • 使用.Select() 与对表执行LINQ 查询相同,只是编写方式不同(尽管底层代码几乎相同)。这是迄今为止最快的方法,但仍需要相当长的时间。
    • 是否有特殊原因必须过滤此级别的结果。在数据库级别做不是更快吗?
    • 这怎么可能呢?数据库不能返回可变数量的表。 (变量,含义,在运行时发生变化。)
    • 什么意思?为什么您不能编写一个存储过程来提取您需要的所有信息,并在运行时执行该存储过程?您是否有基于用户选择或其他内容的所需结果列表?您能否详细说明为什么需要这种方法?
    • 我想,最终,我希望能够根据一列将我的结果分成几组。使用上面的示例,基本上,我想要单独的表,每个表最多有两个“GroupID's”(包括所有其他列)。我认为我的问题足够详细,我不必解释,但我想不是。最终,我需要结果中的所有数据,我只需要将其切碎即可。
    【解决方案2】:

    事实证明 A) 我返回的数据集太大(由于错误),并且 B) LINQ 可能是最快的方法,无需编写一些非常长或 hack-ish 的代码。谢谢大家的想法,但我现在会坚持使用 LINQ。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 2022-01-27
      • 2011-04-18
      • 2021-10-05
      • 1970-01-01
      • 2015-06-22
      • 2013-06-01
      相关资源
      最近更新 更多