DataTable总和重复行

时间:2015-05-08 18:17:26

标签: c# linq datatable

我有DataTable,可以有半重复的行。在图片示例中,两个突出显示的行具有所有相同的值,但“金额”列中的金额。我需要识别那些行并将金额加起来。数据来自文本文件,没有唯一标识行的键。

enter image description here

我看了一下像这样的答案 Best way to remove duplicate entries from a data table但在我的情况下,不仅要匹配一列而且要匹配10。

此外,我尝试了不同的LINQ查询,但未能取得成功。

这是完成工作的SQL查询:

SELECT [Date1],[Date2],[Date3]
      ,SUM([Amount1]) as Summary1
      ,SUM([Amount2]) as Summary2
      ,SUM([Amount3]) as Summary3
      ,[col1],[col2],[Rate1],[Rate2],[Rate3],[product],[comment]
  FROM [Table]
  group by [Date1],[Date2],[Date3],[col1],[col2],[Rate1],[Rate2],[Rate3],[product],[comment]

编辑:为了澄清一下,SQL查询是我在查询SQL表时如何获得成功结果的一个示例。

1 个答案:

答案 0 :(得分:0)

这是你用EF做的:

var result=db.Table
  .GroupBy(r=>new {
      r.Date1,
      r.Date2,
      r.Date3,
      r.col1,
      r.col2,
      r.Rate1,
      r.Rate2,
      r.Rate3,
      r.product,
      r.comment},
  p=>new {
      p.Amount1,
      p.Amount2,
      p.Amount3},
  (key,vals)=>new {
      key.Date1,
      key.Date2,
      key.Date3,
      Amount1=vals.Sum(v=>v.Amount1),
      Amount2=vals.Sum(v=>v.Amount2),
      Amount3=vals.Sum(v=>v.Amount3),
      key.col1,
      key.col2,
      key.Rate1,
      key.Rate2,
      key.Rate3,
      key.product,
      key.comments}
      );

如果您实际上是从dataTable执行此操作,则进行轻微修改:

var result=dt.AsEnumerable()
  .GroupBy(d=>new {
      Date1=d.Field<datetime>("Date1"),
      Date2=d.Field<datetime>("Date2"),
      Date3=d.Field<datetime>("Date3"),
      col1=d.Field<string>("col1"),
      col2=d.Field<string>("col2"),
      Rate1=d.Field<decimal>("Rate1"),
      Rate2=d.Field<decimal>("Rate2"),
      Rate3=d.Field<decimal>("Rate3"),
      product=d.Field<string>("product"),
      comments=d.Field<string>("comments")},
  p=>new {
      Amount1=p.Field<decimal>("Amount1"),
      Amount2=p.Field<decimal>("Amount2"),
      Amount3=p.Field<decimal>("Amount3")},
  (key,vals)=>new {
      key.Date1,
      key.Date2,
      key.Date3,
      Amount1=vals.Sum(v=>v.Amount1),
      Amount2=vals.Sum(v=>v.Amount2),
      Amount3=vals.Sum(v=>v.Amount3),
      key.col1,
      key.col2,
      key.Rate1,
      key.Rate2,
      key.Rate3,
      key.product,
      key.comments}
      );

如果您需要将结果作为数据表,则可以使用许多List To Datatable扩展方法之一。只需在上面的查询末尾添加“.ToList()。AsDataTable()”,将其恢复为数据表。