【问题标题】:How to SUM the value from DISTINCT row using LINQ如何使用 LINQ 对 DISTINCT 行中的值求和
【发布时间】:2013-02-04 20:45:57
【问题描述】:

数据表如下:

Item CartonID Quantity
A    0001     1000
A    0002     500
A    0003     250
A    0002     500
B    0002     500
B    0003     250

我的输出假设是这样的:

ItemNo CartonID        TotalCarton TotalQuantity
A      0001,0002,0003  3           2250
B      0002,0003       2           750

但我的结果如下:

ItemNo  CartonID            TotalCarton  TotalQuantity
    A   0001, 0002, 0003    3              2,250
    B   0002, 0003          2                750

我的代码如下:

var items = ( from item in dtTest.AsEnumerable()
              group item by new
              {
                  Item_No=item.Field<string>("Item")
              }
              into g
              select new
              {
                  g.Key.Item_No,
                  TotalCarton = (from p in dtTest.AsEnumerable()
                                 where p.Field<string>("Item") == g.Key.Item_No
                                 select p.Field<string>("CartonID")).Distinct().ToArray().Count(),
                  Total_Quantity =g.Sum((p=>p.Field<decimal>("Quantity"))).ToString("###,###,###,###"),
                  CartonID = (from p in dtTest.AsEnumerable()
                              where p.Field<string>("Item") == g.Key.Item_No
                              select p.Field<string>("CartonID")).Distinct().ToArray().Aggregate
                              ((p1, p2) => p1 + ", " + p2)
                 }).ToList();

任何人都可以告诉我如何用不同的纸箱 ID 对总数求和。提前致谢。

【问题讨论】:

  • B 项的一共有 4 个纸箱怎么办?
  • TotalCarton 代表什么?为什么在您的示例中,项目 B 的 TotalCarton 应该是四个而不是两个?根据您的数据,对于项目 A,有四个纸箱,但三个主题不同(TotalCarton = 3)。对于 B 项,只有两个纸箱 (TOtalCarton = 2)。
  • 对不起,这是我的错。 B 项的总纸箱为 2 个。

标签: c# linq


【解决方案1】:

您应该 GroupBy CartonID 然后对组元素求和:

类似的东西

dtTest.GroupBy(x => x.CartonId)
      .ToDictionary(y => y.Key, y => y.Sum(z => z.Quantity);

这将返回一个字典,其中包含每个 CartonID 的总数量。我希望我理解正确,这就是你想要的。


根据您说应该检索的输出,我将查询调整为:

dtTest.GroupBy(x => x.ItemNo)
      .Select(itemGroup => new { 
              itemGroup.Key,
              itemGroup.Distinct(item => item.CartonID), 
              itemGroup.Distinct(item => item.CartonID).Count(),
              itemGroup.Sum(item => item.Quantity)
});

【讨论】:

  • 嗨@dutzu,我理解你的想法。但是如何通过 C# 使其在 VS2010 中工作?目前我不能直接使用 dtTest 进行 GroupBy。
  • 您可能需要将 dtTest 转换为 .AsEnumerable 或其他东西:)
  • 我已经尝试使用 dtTest.AsEnumerable() 但剩余代码出现其他语法错误。
  • @Zero - 想法就在那里,您所要做的就是使代码适应您所拥有的。我还对我的代码 sn-p 进行了一些更改。希望对您有所帮助。
  • 好的。我得到结果。非常感谢。
猜你喜欢
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
相关资源
最近更新 更多