首页 > 解决方案 > C#:使用 Field 方法按数据表中的多列进行 LINQ 查询分组

问题描述

我正在尝试按年份和单位获取 t & kg 分组的总和。使用 Field 方法在 Linq 中完成它时遇到问题。然而。我可以在不使用 Field 方法的情况下做到这一点。

数据表中的数据格式如下。

Unit  Quantity  Year
 "t"    "10"    2019
 "t"    "05"    2018
 "kg"   "05"    2018
 "t"    "02"    2019
 "kg"   "14"    2018
 "kg"   "28"    2019

结果应该是这样的;

结果

 Total 2018 in kg - 19 
 Total 2018 in t  - 05
 Total 2019 in kg - 28
 Total 2019 in t  - 12

这就是我现在拥有的所有内容,正如我在 group by 语句中提到的那样,它按所有 3 列进行分组。但是,如果我不这样做,我将无法在 select 语句中访问该列。

代码片段

注意:我没有模型属性结构。

DataTable Dt = dsData.Tables["Data2019"];

 var data = from mfRecords in Dt.AsEnumerable()
        group mfRecords by new
        {
         DataUnit = mfRecords.Field<string>("Unit").ToString(),
         Quantity = Convert.ToDouble(mfRecords.Field<string>("Qty")),
         RecordYear = Convert.ToDateTime(mfRecords.Field<string>("SalesDate")).Year,
        } into g
        select new
         {
          SalesYear = g.Key.RecordYear,
          SalesUnit = g.Key.DataUnit,  
          TotalQty = g.Sum(k => g.Key.Quantity)
         };

这是通过使用 LINQ 完成的

var data = lst.Select(k => new { k.SalesDate.Year, k.Qty, k.Unit })
            .GroupBy(x => new { x.Year,x.Unit }, (key, group) => new
            {
                SalesYear =  key.Year,
                SalesUnit = key.Unit,
                TotalQty = string.Format("{0:0.00}",group.Sum(k => k.Qty))
            })            
            .ToList();

有谁知道我如何使用 LINQ 使用 Field 方法进行分组?

标签: c#.netlinq

解决方案


改为这样:

 var data = from mfRecords in Dt.AsEnumerable()
            group mfRecords by new
            {
             DataUnit = mfRecords.Field<string>("Unit").ToString(),
             RecordYear = mfRecords.Field<string>("SalesDate")
            } into g
            select new
             {
              SalesYear = g.Key.RecordYear,
              SalesUnit = g.Key.DataUnit,  
              TotalQty = g.Sum(k => int.Parse((string)k["Qty"]))
             };

说明:您不需要按数量分组,因为那是您要求和的内容。


推荐阅读