linq group by timespan

时间:2013-02-12 01:20:29

标签: c# .net linq entity-framework

如何按时间分组?我要做的是获取总分钟数,并从分钟函数执行获取时间跨度。

最终,我试图在一个月内获得在特定帐户上花费的平均时间。 我也在试图找到在特定帐户上花费的总时间。

我觉得我很接近,但我在select语句中尝试的所有内容似乎都不起作用。

period = new DateTime(2013,1,1);
endPeriod = new DateTime(2013,1,1).AddMonths(1).AddDays(-1);
account.AccountNumber = 1455;

var q = from logs in db.logs
where logs.AccountNumber == account.AccountNumber
where logs.StartDateTime > period && logs.StartDateTime < endPeriod
let time = new TimeSpan(logs.ElapsedHours, logs.ElapsedMinutes, 0).TotalMinutes
group logs by time into g
select new {
AvgTime = g.Average(g.Key)

}

此查询当前返回5行。它应该只返回1.我不确定我做错了什么。

有什么建议吗?

麦克

2 个答案:

答案 0 :(得分:0)

您的查询有点令人困惑 - 您按值(时间跨度)进行分组,但显然是尝试计算值的平均值,而不是每组中项目的平均值。如果确实如此,请尝试:

period = new DateTime(2013,1,1);
endPeriod = new DateTime(2013,1,1).AddMonths(1).AddDays(-1);
account.AccountNumber = 1455;

var q = from logs in db.logs
where logs.AccountNumber == account.AccountNumber
&& logs.StartDateTime > period && logs.StartDateTime < endPeriod
let time = new TimeSpan(logs.ElapsedHours, logs.ElapsedMinutes, 0).TotalMinutes
group logs by time into g
select new {
Time = g.Key
}

var averageTime = q.Average(i => i.Time);

g.Key只会为每个组提供一个值,这就是为什么你会看到5条记录(我假设你的数据会产生5组)。

答案 1 :(得分:0)

这就是我最终的结果:

var result = (from logs in db.logs
         where logs.AccountNumber == 1450
         where logs.StartDateTime > new DateTime(2013,1,1) && logs.StartDateTime < new DateTime(2013,1,31)
         group logs by logs.AccountNumber into g
         select new {
             AvgTime = (g.Sum(h=>h.ElapsedHours) * 60) + g.Sum(h=>h.ElapsedMinutes) / g.Count(),
             TotalTime = (g.Sum(h=>h.ElapsedHours) * 60) + g.Sum(h=>h.ElapsedMinutes)
         }).ToList()
         .Select(x=> new {
            AvgTime = TimeSpan.FromMinutes(x.AvgTime),
            TotalTime = TimeSpan.FromMinutes(x.TotalTime)
         });