2016-05-17 142 views
-1

這可能很瑣碎,但我不能得到它的工作(LINQ級新手)。linq groupby()和Sum()

我想爲同一天的客戶端(日期顯示在epoc/unixtime中)對行進行分組和總計。

目前它只顯示最大值爲21(從Kbytes轉換爲Gbytes),而不是±26,這是我想看到的。

如何添加GroupBySum子句來爲每天添加Kbytes?

public class Images 
{ 
    public string ClientName { get; set; } 
    public string ImageID { get; set; } 
    public int PolicyType { get; set; } 
    public int ScheduleType { get; set; } 
    public Int64 BackupTime { get; set; } 
    public Int64 KBytes { get; set; } 
} 

public static List<Images> images = new List<Images>(); 

public void calc() 
    { 

     foreach (var client in clients) 
     { 
      totalmax = 0; 
      totalavg = 0; 
      foreach (var ptype in ptypes) 
      { 

       var windowsquery = images 
        .Where(s => s.PolicyType == Convert.ToInt16(ptype) && s.ScheduleType == 0 && s.ClientName == client) 
        .Select(s => s.KBytes); 

       double typemax = windowsquery.DefaultIfEmpty().Max()/1048576; 
       totalmax = Math.Round(totalmax + typemax); 
       double typeavg = windowsquery.DefaultIfEmpty().Average()/1048576; 
       totalavg = Math.Round(totalavg + typeavg); 

      } 
      Console.WriteLine("Client = {0}, Max = {1}, Ave = {2}", client,totalmax, totalavg); 
      Console.ReadKey(); 
     } 
    } 

輸出繼電器(省略了來自輸出的其他客戶端)

客戶=客戶機2,最大值= 21,平均= 14

更新:實施t他的

var summary = (from image in images 
          where image.ScheduleType == 0 
          group image by new 
          { 
           image.ClientName, 
           image.PolicyType, 
           image.ScheduleType, 
           BackupDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0) 
                     .AddSeconds(image.BackupTime) 
                     .ToString("yyyy-MM-dd") 
          } into imageGroup 
          select new 
          { 
           ClientName = imageGroup.Key.ClientName, 
           PolicyType = imageGroup.Key.PolicyType, 
           BakupDateTime = imageGroup.Key.BackupDateTime, 
           SumGBytes = imageGroup.Sum(s => s.KBytes)/1048576.0, 
           AvgGBytes = imageGroup.Average(s => s.KBytes)/1048576.0, 

          } 
            ).ToList(); 

但總和是不正確的,平均工作正常。

Console Ouput

Excel Comparison

+0

此輸入是否包含Client1和Client2的所有記錄?如果是這樣,則Client2的最大值爲〜21,而不是〜26。你爲什麼期望26? – PiKos

+0

是的,這個樣本輸入是正確的。因爲日期(1463234422&1463234420)在同一天。我想要一天的總和sum'd –

+0

好吧,你是對的,我以前沒有注意到這一點。 – PiKos

回答

0

檢查這一項。

var summary = (from image in images 
       group image by new { image.ClientName, 
            image.PolicyType, 
            BackupDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0) 
               .AddSeconds(image.BackupTime) 
               .ToString("MM/dd/yyyy", CultureInfo.InvariantCulture) 
            } into imageGroup 
       select new { ClientName = imageGroup.Key.ClientName, 
          PolicyType = imageGroup.Key.PolicyType, 
          BakupDateTime = imageGroup.Key.BackupDateTime, 
          SumGBytes = imageGroup.Sum(s => s.KBytes)/1048576.0, 
          AvgGBytes = imageGroup.Average(s => s.KBytes)/1048576.0, 
          MaxGBytes = imageGroup.Max(s => s.KBytes)/1048576.0, 
          Records = imageGroup.Count() 
          } 
      ).ToList(); 

可以使用以下查詢列出具有轉換的BackupTime的所有記錄:

var listWithDateTime = (from image in images 
         orderby image.ClientName ascending, 
           image.PolicyType ascending, 
           image.BackupTime ascending 
         select new { 
           ClientName = image.ClientName, 
           PolicyType = image.PolicyType, 
           GBytes = image.KBytes/1048576.0, 
           UnixTimestamp = image.BackupTime, 
           NormalDate = new DateTime(1970, 1, 1, 0, 0, 0, 0) 
              .AddSeconds(image.BackupTime) 
              .ToString("MM/dd/yyyy", CultureInfo.InvariantCulture) 
           } 
         ).ToList(); 
+0

謝謝。其產生的總和不正確,但平均值是正確的。我已經把輸入放入excel並逐行驗證。 –

+0

你能提供一個不正確總和的例子:例如:[日期],[客戶端],[correct_sum],[incorrect_sum] – PiKos

+0

在我上傳的圖片中,你會看到在控制檯輸出中顯示的是平均值,什麼是在Excel中列出。在大多數情況下,每天只有一次實例,所以平均值=總計。並且有少數情況下,有兩個實例在控制檯中列出的平均值等於總量的50%。 –

0

你已經嘗試過這個嗎?

var windowsquery = images 
        .Where(s => s.PolicyType == Convert.ToInt16(ptype) 
        && s.ScheduleType == 0 && s.ClientName == client) 
        .GroupBy(s => s.date) 
        .Select(s => s.Sum(y=>y.KBytes)); 

在附圖中,日期似乎不正確,或者是特殊格式?

+0

嗨,日期是在unix時間(從1970/01/01秒),但我找到了另一種方法來轉換。對於測試,我可以嘗試使2行中的「日期字段」匹配,以查看groupby是否有效。 –

+0

我現在試過了,回想起我今天早些時候做過。當我將groupby放在select前面時,Kbytes會變成紅色,並且它會顯示「名稱Kbytes在當前上下文中不存在」。如果我刪除groupby,它再次看起來很好。 –

+0

是的對不起,我在飛行中寫道,現在糾正:Select(s => s.Sum(y => y.KBytes));我更習慣於查詢語法。 –

0

這似乎重複後,答案已經在堆棧溢出可用...

var windowsquery = images 
       .Where(s => s.PolicyType == Convert.ToInt16(ptype) && s.ScheduleType == 0 && s.ClientName == client).GroupBy(s => YourDateField) 
       .Select(s => s.Sum(i => i.KBytes)); 

var windowsquery = images 
         .Where(s => s.PolicyType == Convert.ToInt16(ptype) && s.ScheduleType == 0 && s.ClientName == client).GroupBy(s => YourDateField) 
         .Select(g=>new { sum = g.Sum(k=>k.KBytes), field = g.Key });