2016-04-18 11 views
1

中で、私はこのタイプのVB.NETでのDataTableを持っている:VB.NETとLINQ - グループのDataTable

"Yr","Mnth","Period","Amount" 
2016, 1, 2016-01, 550.36 
2016, 1, 2016-01, 9000.79 
2015, 12, 2015-12, 10000.30 
2015, 12, 2015-12, 20 

私がやりたいことは、私はSQLの場合と同様にLINQを使用してこのデータを集計することです言語:

SELECT Yr, Mnth, Period, SUM(Amount) AS Amount 
GROUP BY Yr, Mnth, Period; 

私はVB.NETでLINQを使用しようとしましたが、正しく取得できませんでした。 誰かが私にある程度の洞察を与えることができますか? ありがとうございます。

+0

これまでに何を試しましたか? 'DataTable'からデータをグループ化するか、代わりにソースデータをグループ化できますか? –

答えて

1
Dim Amounts As New DataTable 'Your code to load actual DataTable here 
Dim amountGrpByDates = From row In Amounts 
         Group row By dateGroup = New With { 
                Key .Yr = row.Field(Of Integer)("Yr"), 
                Key .Mnth = row.Field(Of Integer)("Mnth"), 
                Key .Period = row.Field(Of String)("Period") 
               } Into Group 
         Select New With { 
            Key .Dates = dateGroup, 
             .SumAmount = Group.Sum(Function(x) x.Field(Of Decimal)("Amount"))} 

I型整数、Period列とAmount進数であることがYrMnthを仮定する。 あなたのタイプと異なる場合はタイプを変更してください。

0

ここにC#コードがあります。

public static class program 
{ 
    static void Main(string[] args) 
    { 

     try 
     { 
      var table = new DataTable(); 
      table.Columns.Add("year", typeof(string)); 
      table.Columns.Add("month", typeof(string)); 
      table.Columns.Add("period", typeof(string)); 
      table.Columns.Add("amount", typeof(decimal)); 

      var row = table.NewRow(); 
      table.Rows.Add(row); 
      row["year"] = "2015"; 
      row["month"] = "Jan"; 
      row["period"] = "Period1"; 
      row["amount"] = 100; 


      row = table.NewRow(); 
      table.Rows.Add(row); 
      row["year"] = "2015"; 
      row["month"] = "Jan"; 
      row["period"] = "Period1"; 
      row["amount"] = 50; 

      row = table.NewRow(); 
      table.Rows.Add(row); 
      row["year"] = "2016"; 
      row["month"] = "Fed"; 
      row["period"] = "Period2"; 
      row["amount"] = 5.55; 


      var result = (from r in table.AsEnumerable() 
          group r by new 
          { 
           Year = r.Field<string>("year"), 
           Month = r.Field<string>("month"), 
           Period = r.Field<string>("period"), 
          } into grp 
          select new { 
           grp.Key, 
           total = grp.Sum(p=> p.Field<decimal>("amount")) 
          }); 


      foreach(var grp in result) 
      { 
       Console.WriteLine("{0} {1} {2} = {3}", grp.Key.Year, grp.Key.Month, grp.Key.Period, grp.total); 
      } 


     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

    } 

}