2017-04-24 6 views
2

C#Linqから以下の結果を得るにはどうすればよいですか?C#Linqでグループごとに複数の列を選択し、同時に値フィールドに合計(集計関数)を適用します

List<DataValues> dValues = getvalues().Tolist(); 

dValuesフィールドは、次のとおりです。

[0]= Year: 2014 Month:Jan Location: "ABC" Value: 201 
[1]= Year: 2015 Month:Feb Location: "ED" Value: 560 
[2]= Year: 2014 Month:Jan Location: "ABC" Value: 320 
[3]= Year: 2015 Month:Feb Location: "EDF" Value: 240 

は、最後に合計としてYearMonthLocationSum列を取得Value列を合計し、その後YearによってdValuesグループから値を取得し、その後Monthと。

私が試した:

var sp = (from a in dValues 
      select new { a.Year, a.Month, a.LOCATION, a.Value }).ToList(); 
+0

まだ試しましたか? 'Year'と' Month'で 'sum'をグループ化したいだけでなく、' Location'を選択したいのですか?場所別にグループ化してはいけませんか? –

+0

**ギラードグリーン**、私はこれをやろうとしました。 ** var sp =(dValuesのaから、新しい{a.Year、a.Month、a.LOCATION、a.Value}を選択する)ToList(); **ただし、集計関数や集計関数の適用方法はありません。 – Scavenger

答えて

2

を使用すると、データの集約のいずれかの種類を実行するために何をしたいです使用することですgroup byです。あなたの現在の試みでは、新しいオブジェクトを投影したばかりです。また

var result = getvalues().GroupBy(item => new { item.Year, item.Month, item.Location }, 
           selector => selector.Value) 
         .Select(grouping => new 
         { 
          Year = grouping.Key.Year, 
          Month = grouping.Key.Month, 
          Location = grouping.Key.Location, 
          Total = grouping.Sum() 
         }); 

- getvaluesToListを行うための恥である - それは場所を取るために、以前のクエリを実行し、すべての更なる照会を引き起こしてデータを取得します。

var result = (from item in getvalues() 
       group item.Value by new { item.Year, item.Month, item.Location } into g 
       select new { 
        Year = g.Key.Year, 
        Month = g.Key.Month, 
        Location = g.Key.Location, 
        Total = g.Sum() 
       }); 

そして、メソッドの構文でこれを参照してください。メモリ内ではなく、データベース内のsqlとして。

+0

うわー!学ぶために多くを得た、私はコードにヒットし、その後戻ってくるだろう。ありがとう – Scavenger

+0

@スカベンジャーあなたは歓迎です:) –

+0

** Gilad Green **、すべての行の下部に追加の行を挿入できます。これは、各列の合計が2つ以上の値の列を持つことを示します。 – Scavenger

関連する問題