Linq – 用和计算分组

Linq noob在这里。 我该如何纠正?

var result = (from row in rulestable.AsEnumerable() let sup = row.Field("Supplier") let amo = row.Field("Amount") let adv = row.Field("Advance") let bal = row.Field("Balance") let vat = row.Field("VatRate") group row by new { sup, vat } into grp select new { Supplier = grp.Key.sup, Amount = grp.Sum(grp => grp["amo"]), Advance = grp.Sum(grp => grp["adv"]), Balance = grp.Sum(grp => grp["bal"]), VatRate = grp.Key.vat }).ToList(); 

我想将我的数据表“rulestable”分组在2列,即Supplier和VatRate上。 必须将结果的金额,预付款和余额设置为分组的任何列的总和。

我得到一个错误 – “grp.Sum上的类型参数无法从使用中推断出来”。 但是,我认为这个表达式都是错误的 – 我认为它会将结果列和我想要的源列相加。

例:

输入数据表:
供应商,金额,预付款,余额,VatRate
S1,10,5,5,1
S1,10,5,5,1

预期产量:
S1,20,10,10,1


最好的方法是什么?

在lambda中, grp (我已经将r重命名为row以区别于组本身)将成为DataRow 。 编译器不知道grp [string]返回什么数据类型,因为它只返回一个object 。 试试这个:

 DataTable rulestable = new DataTable(); rulestable.Columns.Add("Supplier"); rulestable.Columns.Add("Amount", typeof(decimal)); rulestable.Columns.Add("Advance", typeof(decimal)); rulestable.Columns.Add("Balance", typeof(decimal)); rulestable.Columns.Add("VatRate", typeof(decimal)); rulestable.Rows.Add("S1", 10M, 5M, 5M, 1M); rulestable.Rows.Add("S1", 10M, 5M, 5M, 1M); var result = (from row in rulestable.AsEnumerable() let sup = row.Field("Supplier") let amo = row.Field("Amount") let adv = row.Field("Advance") let bal = row.Field("Balance") let vat = row.Field("VatRate") group row by new { sup, vat } into grp select new { Supplier = grp.Key.sup, Amount = grp.Sum(r => r.Field("Amount")), Advance = grp.Sum(r => r.Field("Advance")), Balance = grp.Sum(r => r.Field("Balance")), VatRate = grp.Key.vat }).ToList(); 
输入:
供应商| 金额| 进展| 平衡|  VatRate
 -----------------------------------------------
    S1 |  10 |  5 |  5 |  1
 -----------------------------------------------  
    S1 |  10 |  5 |  5 |  1

结果:
供应商| 金额| 进展| 平衡|  VatRate
 -----------------------------------------------
    S1 |  20 |  10 |  10 |  1

使用您提供的输入,可以得到您预期的结果。

当我运行此查询时,我在visual studio中失败了。 在更多搜索中找到以下内容并在我的系统中运行良好。

 var result = (from row in rulestable.AsEnumerable() group row by new {sup= row.Field("Supplier"), vat=row.Field("VatRate")} into grp = Group select new With {.Supplier = sup, .Amount = grp.Sum(r => r.Field("Amount")), .Advance = grp.Sum(r => r.Field("Advance")), .Balance = grp.Sum(r => r.Field("Balance")), .VatRate = vat } ).ToList();