2017-04-24 19 views
2

如何從C#Linq獲取以下結果。C#Linq按組選擇多個列並同時在值字段上應用sum(聚合函數)

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 

dValues組獲取值由Year然後Month再總結的Value列最後得到YearMonthLocationSum列總計。

我想:你爲了執行任何類型的數據的聚集想要什麼

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

你嘗試過什麼嗎?你想按「年」和「月」按組來「總結」,還要選擇「地點」?它不應該按地點分組嗎? –

+0

**吉拉德綠**,我試圖做到這一點。 ** var sp =(from a in dValues select new {a.Year,a.Month,a.LOCATION,a.Value})。ToList(); **但沒有運氣如何應用sum或任何聚合函數。 – Scavenger

回答

2

是使用被group by。在你目前的嘗試中,你只是投射一個新的物體。看到這一點:

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

而且在方法的語法:

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

而且 - 這是一個恥辱做ToListgetvalues - 它執行之前的查詢和檢索導致所有進一步詢問發生數據在內存中而不是數據庫中的sql。

+0

哇!有很多東西需要學習,我會在代碼上打一針,然後再回來。謝謝 – Scavenger

+0

@清道夫歡迎:) –

+0

** Gilad Green **,我們可以在所有行的底部注入額外的行,這將顯示每列的總數,說我有兩個或更多值列。 – Scavenger