【问题标题】:Select from DataTable most recent result for each item从 DataTable 中选择每个项目的最新结果
【发布时间】:2014-10-14 03:56:38
【问题描述】:

我有一个包含数千行的数据表。表格中有序列号栏和测试号栏。如果对一个序列进行了多次测试,则测试编号会增加。我需要能够从我的数据表中为每个序列选择最新的测试并将其插入另一个数据表。目前我正在使用这个:

    DataTable newdata = data.AsEnumerable().Where(x => x.Field<Int16>("Test") == 
                data.AsEnumerable().Where(y => y.Field<string>("Serial") == 
                    x.Field<string>("SerialNumber")).Select(y => 
                        y.Field<Int16>("Test")).Max()).Select(x => x).CopyToDataTable();

这确实可以完成工作,但是很明显它的效率非常低。有没有更有效的方法来选择每个序列号的第一行数据?

谢谢

解决方案

因此,根据 Cam Bruce 的回答,我使用字典而不是连接实现了以下代码:

    //Get all of the serial numbers and there max test numbers
    Dictionary<string, Int16> dict = data.AsEnumerable().GroupBy(x => x.Field<string>("SerialNumber")).ToDictionary(x => x.Key, x => x.Max(y => y.Field<Int16>("Test")));

    //Create a datatable with only the max rows
    DataTable newdata = data.AsEnumerable().Where(x => x.Field<Int16>("Test") == 
                dict[x.Field<string>("SerialNumber")]).Select(x => x).CopyToDataTable();

    //Clear the dictionary
    dict.Clear();

【问题讨论】:

  • 你能写SQL来执行这个逻辑吗?这会比扫描整个DataTable 更有效率很多
  • sql获取值并显示在datatable是有效的方法
  • 不幸的是,软件的性质决定了我无法有效地查询 SQL 数据库。
  • 抱歉,不是软件的性质 - 数据库的性质。

标签: c# visual-studio datatable


【解决方案1】:

这将为您提供每个序列号和Max 测试。然后,您可以将该结果集连接回 DataTable 以获取所有最大行数。

var maxTest= data.AsEnumerable()
                  .GroupBy(g=> g.Field<string>("SerialNumber"))
                  .Select(d=> new
                  {
                     SerialNumber = g.Key
                     Test = g.Max(g.Field<Int16>("Field"))
                  };

var maxRows = from d in data.AsEnumerable()
              join m in maxTest
              on new { S = d.Field<string>("SerialNumber"), T = d.Field<Int16>("Test") } 
              equals new { S = m.SerialNumber, T = m.Test }
              select d;

【讨论】:

  • 哦,太好了。我没想过用一个连接把它分成两个部分。我把它放进去,看看它是如何运行的!干杯
  • 我已经修改了原始问题,因此根据您的答案的想法显示最终解决方案略有不同。
猜你喜欢
  • 1970-01-01
  • 2013-01-12
  • 2011-09-11
  • 1970-01-01
  • 2011-01-13
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多