2010-06-21 2 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

Как именно компилятор жалуется? –

+0

Какова ошибка компилятора? –

+0

System.LINQ.IQueryable Не содержит определения для «Среднее» –

ответ

6

кажется, что вы должны использовать SqlMethods.DateDiff в Linq2SQL заявления (функция 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 на первом месте. –

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). Средство(), 0)); –

+0

@David: вы можете упростить его до 'TimeSpan.FromTicks (ProcessElementTimes.Average (x => x.Ticks);' Кроме того, вам действительно нужно округление? Если вы это сделаете, округление результата вместо каждого значения будет больше Точный. – BatteryBackupUnit

-2
var avg=(from t in array select (t.endtime.Ticks-t-starttime.Ticks)).Average(); 
Console.Write(new DateTime((long)avg).TimeOfDay); 
Смежные вопросы