使用linq求和数据表列

本文关键字:数据表 求和 linq 使用 | 更新日期: 2023-09-27 18:13:03

大家好,我的数据表如下

SKU  Quantity  UnitPrice  LinePrice
 A     10         2         20
 A     10         2         20
 B     10         2         40

我想汇总具有重复记录的SKU,并得到如下结果

SKU  Quantity  UnitPrice  LinePrice
 A     20         2         40
 B     10         2         40

我试过了,但是没有运气

var query = from row in lDTSalesOrder.AsEnumerable()
                            group row by row.Field<string>("SKU") into grp
                            orderby grp.Key
                            select new
                            {
                                Id = grp.Key,
                                Sum = grp.Sum(r => r.Field<double>("UnitPrice"))
                            };

使用linq求和数据表列

在您的示例输出中,您没有实际求和单价,但听起来您想要的是这样的东西:

var results = 
    from row in lDTSalesOrder
    group row by row.Field<string>("SKU") into grp
    orderby grp.Key
    select new
    {
        SKU = grp.Key,
        Quantity = grp.Sum(r => r.Field<double>("Quantity")),
        UnitPrice = grp.Sum(r => r.Field<double>("UnitPrice")),
        LinePrice = grp.Sum(r => r.Field<double>("LinePrice"))
    };

这将产生:

SKU  Quantity  UnitPrice  LinePrice
 A     20         4         40
 B     10         2         40

如果您真的想为第一个结果记录生成2的单价,那么Sum不是您想要的;你必须使用其他的聚合函数。MinMaxAverage甚至Select(...).First()都会产生这个结果,但是您必须更精确地定义您想要输出的内容。你也可以这样做:

var results = 
    from row in lDTSalesOrder
    group row by new { SKU = row.Field<string>("SKU"), UnitPrice = row.Field<string>("UnitPrice") } into grp
    orderby grp.Key.SKU
    select new
    {
        SKU = grp.Key.SKU,
        Quantity = grp.Sum(r => r.Field<double>("Quantity")),
        UnitPrice = grp.Key.UnitPrice,
        LinePrice = grp.Sum(r => r.Field<double>("LinePrice"))
    };

这些选项中的任何一个都将产生:

SKU  Quantity  UnitPrice  LinePrice
 A     20         2         40
 B     10         2         40