2

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

                var result = (from row in rulestable.AsEnumerable()
                         let sup = row.Field<int>("Supplier")
                         let amo = row.Field<decimal>("Amount")
                         let adv = row.Field<decimal>("Advance")
                         let bal = row.Field<decimal>("Balance")
                         let vat = row.Field<decimal>("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 上的“无法从用法中推断出类型参数”。但是,我认为这个表达式都是错误的——我认为它将对结果列求和,而不是像我想要的那样对源列求和。

例子:

输入数据表:
Supplier, Amount, Advance, Balance, VatRate
S1, 10, 5, 5, 1
S1, 10, 5, 5, 1

预期输出:
S1、20、10、10、1


最好的方法是什么?

4

2 回答 2

4

在 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<string>("Supplier")
              let amo = row.Field<decimal>("Amount")
              let adv = row.Field<decimal>("Advance")
              let bal = row.Field<decimal>("Balance")
              let vat = row.Field<decimal>("VatRate")
              group row by new { sup, vat } into grp
              select new
              {
                  Supplier = grp.Key.sup,
                  Amount   = grp.Sum(r => r.Field<decimal>("Amount")),
                  Advance  = grp.Sum(r => r.Field<decimal>("Advance")),
                  Balance  = grp.Sum(r => r.Field<decimal>("Balance")),
                  VatRate  = grp.Key.vat
              }).ToList();
输入:
供应商 | 金额 | 前进 | 余额 | 增值税
-----------------------------------------------------------
   S1 | 10 | 5 | 5 | 1
-----------------------------------------------------------  
   S1 | 10 | 5 | 5 | 1

结果:
供应商 | 金额 | 前进 | 余额 | 增值税
-----------------------------------------------------------
   S1 | 20 | 10 | 10 | 1

使用您提供的输入,这将给出您在上面所期望的结果。

于 2012-05-22T12:34:01.937 回答
0

当我运行此查询时,我在 Visual Studio 中失败了。在更多搜索中发现以下内容并在我的系统中运行良好。

var result = (from row in rulestable.AsEnumerable() 
             group row by new {sup= row.Field<string>("Supplier"), 
                              vat=row.Field<decimal>("VatRate")} into grp = Group 
             select new With 
             {.Supplier = sup, 
              .Amount = grp.Sum(r => r.Field<decimal>("Amount")),
              .Advance  = grp.Sum(r => r.Field<decimal>("Advance")),
              .Balance  = grp.Sum(r => r.Field<decimal>("Balance")),
              .VatRate  = vat
              }
             ).ToList();
于 2015-09-24T14:36:45.640 回答