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();