将多个DataRows连接到一个DataRow中

我使用.NET 3.5在C#中编写它。 我有一个System.Data.DataSet对象,其中包含一个使用以下模式的DataTable:

Id : uint AddressA: string AddressB: string Bytes : uint 

当我运行我的应用程序时,让我们说DataTable充满了以下内容:

 1 192.168.0.1 192.168.0.10 300 2 192.168.0.1 192.168.0.20 400 3 192.168.0.1 192.168.0.30 300 4 10.152.0.13 167.10.2.187 80 

我希望能够查询这个DataTable,其中AddressA是唯一的,并且字节列被加在一起(我不确定我是否正确地说)。 从本质上讲,我想得到以下结果:

 1 192.168.0.1 1000 2 10.152.0.13 80 

我最终希望将这个结果放在一个可以绑定到DataGrid的DataTable中,我需要每5秒左右更新/重新生成一次这个结果。

我该怎么做呢? DataTable.Select()方法? 如果是这样,查询是什么样的? 是否有替代/更好的方法来实现我的目标?

编辑:我没有数据库。 我只是使用内存中的DataSet来存储数据,因此纯SQL解决方案在这里不起作用。 我试图找出如何在DataSet本身内完成它。

为了便于阅读(因为我喜欢它),我会尝试使用LINQ:

 var aggregatedAddresses = from DataRow row in dt.Rows group row by row["AddressA"] into g select new { Address = g.Key, Byte = g.Sum(row => (uint)row["Bytes"]) }; int i = 1; foreach(var row in aggregatedAddresses) { result.Rows.Add(i++, row.Address, row.Byte); } 

如果使用LINQ解决方案发现性能问题,我将使用手动解决方案,在原始表的循环中汇总行并将它们插入结果表中。

您还可以将聚合地址直接绑定到网格,而不是将其放入DataTable中。

最有效的解决方案是直接在SQL中进行求和

通过AddressA从…组中选择AddressA,SUM(字节)

我同意Steven的观点,即在服务器端执行此操作是最佳选择。 如果你使用的是.NET 3.5,那么你不必经历Rune建议的内容。 而是使用数据集的扩展方法来帮助查询和求和值。

然后,您可以轻松地将其映射到匿名类型,您可以将其设置为网格的数据源(假设您不允许对此进行编辑,我不知道如何,因为您正在聚合数据) 。

我同意Steven的说法,最好的方法是在数据库中完成。 但如果这不是一个选项,您可以尝试以下方法:

  • 创建一个新的数据表,并使用DataTable.Columns.Add(name,datatype)手动添加所需的列
  • 逐步执行第一个数据表Rows集合,并为每一行使用DataTable.NewRow()在新数据表中创建一个新行
  • 将第一个表中找到的列的值复制到新行中
  • 使用Select()在其他数据表中查找匹配的行,并将最终值复制到新数据行中
  • 使用DataTable.Rows.Add(newRow)将行添加到新数据表中

这将为您提供一个新数据表,其中包含来自两个表的组合数据。 它不会很快,但除非您拥有大量数据,否则它可能足够快。 但是尽量避免在Select中进行LIKE查询,因为那个很慢。

如果两个表包含具有相同主键的行,则可能进行一种优化。 然后,您可以对两个表进行排序,并逐步执行它们使用数组索引获取两个数据行。 这样就可以摆脱Select调用。