LINQ如何显示GroupBy中所有结果的平均值

时间:2014-01-17 09:02:11

标签: c# linq

我正在尝试编写一个查询,该查询返回在票务系统中的工作上花费的平均时间。 每个作业都有多个时间日志,因此我需要按SO编号进行分组,然后以某种方式获得所有结果的平均值。

当前查询返回每个服务订单的列表以及花在该作业上的总分钟数。

如何向我展示每项工作所花费的平均时间?

from so in TblServiceOrders
from sologs in TblSOLogs.Where(x => x.SONumber == so.SONumber).DefaultIfEmpty()


where so.DateClosed >= new DateTime(2013,07,01) 
where so.DateClosed <= new DateTime(2013,07,02)
where sologs.ElapsedHours != 0 || sologs.ElapsedMinutes != 0

group new { sologs.ElapsedHours, sologs.ElapsedMinutes } by so into g
select new { 
g.Key.SONumber,
elapsed = g.Average (x => (x.ElapsedHours == null ? 0 : x.ElapsedHours * 60) + (x.ElapsedMinutes == null ? 0 : x.ElapsedMinutes))
}

== EDIT ==

这看起来很接近,但它给了我每次登录的平均值,而不是每个SO的总时间日志的平均值。

请帮帮忙?

from so in TblServiceOrders
join sologs in TblSOLogs on so.SONumber equals sologs.SONumber

where so.DateClosed >= new DateTime(2013,07,01) 
where so.DateClosed <= new DateTime(2013,07,03)
where sologs.ElapsedHours != 0 || sologs.ElapsedMinutes != 0

group sologs.SONumber by sologs into g
group new {g.Key.ElapsedHours, g.Key.ElapsedMinutes} by "Total" into t

select t.Average (x => (x.ElapsedHours == null ? 0 : x.ElapsedHours * 60) + (x.ElapsedMinutes == null ? 0 : x.ElapsedMinutes))

1 个答案:

答案 0 :(得分:0)

我大部分时间都在努力,希望这可以帮助别人。

我的问题的第一部分是将所有结果都放到同一组中而没有Group By的明显价值。这是通过在Group By中声明一个字符串来实现的,例如“Total”。

例如:

group tblName.FieldName by "Example" into group1

对于第二部分,我需要在另一个Group By的{​​{1}}上执行Sum。以下是声明从Group By的{​​{1}}生成的两个新值的示例:

Sum

以下是我最后编写的代码的完整示例,它在Group By中运行良好,但我仍在致力于group new { tblName.FieldName1, tblName.FieldName2} by tblName into group1 group new { SumField1 = g.Sum (x => x.FieldName1), SumField2 = g.Sum (x => x.FieldName2) } by "Totals" into newgroup2 LINQPad Visual Studio的实现。

C#