2014-01-17 55 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() 
}