【发布时间】:2016-05-17 12:42:00
【问题描述】:
这可能很微不足道,但我无法让它工作(linq 级别的新手)。
我想对同一天的客户的行进行分组和求和(日期显示在 epoc/unixtime 中)。
目前它只是将最大值显示为 21(从 Kbytes 转换为 Gbytes),而不是我想要看到的 ±26。
如何添加 GroupBy 和 Sum 子句以添加每天的千字节?
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();
}
}
输出(从输出中省略其他客户端)
Client = Client2,Max = 21,Ave = 14
更新:实现了这个
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();
但总和不正确,平均值工作正常。
【问题讨论】:
-
此输入是否包含 Client1 和 Client2 的所有记录?如果是这样,那么 Client2 的最大值是 ~21,而不是 ~26。你为什么要 26 岁?
-
是的,这个示例输入是正确的。因为日期(1463234422 & 1463234420)是同一天。我想要一天总和的大小
-
好吧,你是对的,我以前没有注意到这一点。