2

ここでLinq noob。これを修正するにはどうすればよいですか?

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

Supplier と VatRate の 2 つの列でデータテーブル "rulestable" をグループ化したいと考えています。結果のAmount、Advance、およびBalanceは、グループ化された列の合計に設定する必要があります。

grp.Sum で「型引数を使用法から推測できません」というエラーが表示されます。ただし、この式はすべて間違っていると思います。必要なソース列ではなく、結果列を合計すると思います。

例:

入力データテーブル:サプライヤー、金額、前払い、残高 、
VatRate S1、10、5、5、1 S1、10、5、5、1


期待される出力:
S1、20、10、10、1


これを行う最善の方法は何ですか?

4

2 に答える 2

4

ラムダの内部(グループ自体と区別するために行の名前をgrp変更しました)は、になります。コンパイラは、.を返すだけなので、grp[string]が返すデータ型を認識しません。これを試して: rDataRowobject

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();
入力:
サプライヤー| 金額| アドバンス| バランス| VatRate
-----------------------------------------------
   S1 | 10 | 5 | 5 | 1
-----------------------------------------------  
   S1 | 10 | 5 | 5 | 1

結果:
サプライヤー| 金額| アドバンス| バランス| VatRate
-----------------------------------------------
   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 に答える