2010-06-21 90 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);