2010-06-21 159 views
5

我有一個數據庫表,其中包含一個事件的開始時間和結束時間的條目。我想參加這些參賽作品並找出一個事件的平均長度。減法不成問題。但是,當我嘗試獲得平均值時,編譯器會抱怨。LINQ平均時間跨度?

這是我目前的LINQ查詢:

public TimeSpan? getAverageTime() 
    { 
     return (from EventTime in db.EventTimes 
       where EventTime.EventTimesID > 0 
       select (EventTime.TimeEnd - EventTime.TimeStart)).Average(); 
    } 

我也試過.SUM()和.Aggregate(),這樣我可以有一些幫助,但沒有被接受。

什麼是實現我的目標的最佳方法?

+1

究竟如何編譯器抱怨嗎? – 2010-06-21 15:44:26

+0

你得到的編譯器錯誤是什麼? – 2010-06-21 15:47:39

+0

System.LINQ.IQueryable 不包含'Average'的定義 – 2010-06-21 15:51:14

回答

6

看來,你必須使用LINQ2SQL語句SqlMethods.DateDiff(DATEDIFF函數如果SQL):

public int getAverageTime() 
    { 
     return (from EventTime in db.EventTimes 
       where EventTime.EventTimesID > 0 
       select (SqlMethods.DateDiffMinute(EventTime.TimeStart, EventTime.TimeEnd)).Average(); 
    } 
+2

你是對的!這很好,唯一必要的改變就是TimeEnd最先。 – 2010-06-21 15:58:40

5

Average不適用於TimeSpan值,這是您減去兩個DateTime值時得到的結果。嘗試平均(EventTime.TimeEnd - EventTime.TimeStart).TotalMilliseconds,然後將其轉換回TimeSpan。

+0

非常好。這一個爲我工作。有TimeSpan對象的列表出現,並且您的建議工作:TimeSpan avg = new TimeSpan(TimeSpan.TicksPerMillisecond *(long)System.Math.Round(ProcessElementTimes.Select(time => time.TotalMilliseconds).Average(), 0)); – 2012-06-18 12:57:30

+0

@David:你可以簡化爲TimeSpan.FromTicks(ProcessElementTimes.Average(x => x.Ticks);'此外,你真的需要四捨五入嗎?如果你這樣做,四捨五入的結果,而不是每個值將更多精確 – BatteryBackupUnit 2013-08-22 12:51:18

-2
var avg=(from t in array select (t.endtime.Ticks-t-starttime.Ticks)).Average(); 
Console.Write(new DateTime((long)avg).TimeOfDay);