2014-01-17 54 views
0

我正在尝试编写一个查询,它将返回在售票系统中工作所花费的平均时间。 每个工作都有多个时间日志,所以我需要按SO编号进行分组,然后以某种方式获得所有结果的平均值。LINQ如何显示GroupBy中所有结果的平均值

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

我该如何让每个工作所花的平均分钟数?

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)) 
} 

== ==编辑

这看起来是越来越接近,但它给我每次记录的平均,而不是总时间日志的平均值在每个左右。

请帮忙?

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)) 
+0

显示的查询不会编译,是吗?您通过ElapsesHours和ElapsedMinutes进行分组,然后使用Key.SoNumber ...您应该按照SoNumber进行分组,不需要? –

+0

此查询是否应该在数据库或内存集合上工作?因为如果它应该在数据库上工作,那么它就有很大的问题。 – Cosmin

+0

它应该在数据库上运行,它运行正常,它只是返回每个SO与总数。该查询不应该工作,这是我在努力获得结果的地方。 –

回答

0

我已经完成了大部分,希望这可以帮助其他人。

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

例如:

group tblName.FieldName by "Example" into group1 

对于第二部分我需要在另一个Group BySum执行Group By。以下是声明从的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但我还在努力实现到a Visual StudioC#DataGridView

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

where so.DateClosed >= new DateTime(2014,01,17) 
where so.DateClosed <= new DateTime(2014,01,17) 
where sologs.ElapsedHours != 0 || sologs.ElapsedMinutes != 0 

group new {sologs.ElapsedHours, sologs.ElapsedMinutes} by sologs.SONumber into g 
group new {hours = g.Sum (x => x.ElapsedHours), mins = g.Sum (x => x.ElapsedMinutes)} by "Totals" into t 

select new { 
Average = t.Average (x => (x.hours * 60) + x.mins), 
Count = t.Count() 
}