2016-05-17 152 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 });