【问题标题】:Fastest way to extract DataTable from bigger DataTable?从更大的数据表中提取数据表的最快方法?
【发布时间】:2013-10-11 09:21:36
【问题描述】:

假设我在这个结构中有一个表

Id | Name | Product
-------------------
1   Name1   Product1
1   Name1   Product2
2   Name3   Product3
3   Name4   Product4

该表在返回它的 sql 查询中按 ID 排序。 现在,我想提取包含每个唯一 ID 的指定行的 DataTable。 这意味着使用上面的示例,我应该得到三个 DataTables,其中包含具有不同 Id 值的行。

【问题讨论】:

  • 无论如何,您都需要遍历每一行。您应该尝试发送另一个 SQL 查询,而不是在已获取的结果中进行搜索。
  • 你的输出应该是什么样的????
  • 您想对产品做什么?第一个(MIN),最后一个(MAX),计数?听起来您应该在 SQL 查询到达数据表之前执行此操作。
  • 尝试使用公用表表达式并从服务器获取数据。除非您需要所有(未过滤的)数据,否则这将是最快的方法。

标签: c# datatable


【解决方案1】:

使用数据视图。

var view = new System.Data.DataView(table);
view.Sort = "id";

foreach(var id in new [] {1,2,3})
{
    view.RowFilter = "id = " + id.ToString();
    var result = view.ToTable();
}

【讨论】:

    【解决方案2】:

    您可以尝试linq 使用datatable 实现此目的,something 如下所示(这绝不是经过尝试和测试的 em>):

    var groupedResults= from r in dataTable.AsEnumerable()
                      group r by r.Field<string>("Id") into g
                      select new
                      {
                          Id = g.Key,
                          Name = g.Min(),
                          Product = g.Count()
                      };
    

    最有效的方法可能是在数据表之前直接使用 SQL:

    SELECT Id, Name, MIN(Product)
    FROM [Your_Table]
    GROUP BY Id, Name
    

    此示例采用第一个 Product

    要获得 Count 的产品,请执行以下操作:

    SELECT Id, Name, COUNT(Product)
    FROM [Your_Table]
    GROUP BY Id, Name
    

    【讨论】:

      【解决方案3】:

      您应该使用 DataView.RowFilter() 来快速获取它。请参考DataTable.Select() Vs DataView.RowFilter() Performance Test – Filtering Rows

      【讨论】:

        【解决方案4】:

        试试这个:

        string expression = "Id = yourId";
        DataRow[] foundRows = originalTable.Select(expression);
        

        【讨论】:

          猜你喜欢
          • 2019-12-31
          • 1970-01-01
          • 2018-06-25
          • 2016-08-03
          • 1970-01-01
          • 1970-01-01
          • 2010-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多