2010-06-21 10 views
5

Mam tabelę bazy danych, która zawiera wpisy dotyczące czasu rozpoczęcia i czasu zakończenia wydarzenia. Chciałbym wziąć te wpisy i znaleźć średnią długość wydarzenia. Odejmowanie nie stanowi problemu. Jednak gdy próbuję uzyskać średnią wartość, kompilator narzeka.Średni czas LINQ?

Oto mój obecny zapytań LINQ:

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

Próbowałem też .Sum() i .Aggregate() tak, że mogę mieć coś do pracy, ale nie są akceptowane.

Jaka jest najlepsza metoda na osiągnięcie mojego celu?

+1

Jak dokładnie działa kompilator narzekać? –

+0

Jaki jest błąd kompilatora? –

+0

System.LINQ.IQueryable Nie zawiera definicji "Średnia" –

Odpowiedz

6

Wydaje się, że trzeba użyć SqlMethods.DateDiff w linq2sql rachunku (funkcja DateDiff jeśli SQL):

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

Masz rację, działa to świetnie, jedyną konieczną zmianą jest to, że TimeEnd jest najważniejszy. –

5

Average nie działa z wartościami TimeSpan, które można uzyskać po odjęciu dwóch wartości DateTime. Spróbuj uśrednić (EventTime.TimeEnd - EventTime.TimeStart).TotalMilliseconds, a następnie przekonwertuj to z powrotem na TimeSpan.

+0

Doskonała. Ten pracował dla mnie. Miał listę obiektów TimeSpan do avergae out, a Twoja sugestia działała: TimeSpan avg = new TimeSpan (TimeSpan.TicksPerMillisecond * (long) System.Math.Round (ProcessElementTimes.Select (time => time.TotalMilliseconds) .Average(), 0)); –

+0

@David: Możesz uprościć go do 'TimeSpan.FromTicks (ProcessElementTimes.Average (x => x.Ticks) ;, poza tym, czy naprawdę potrzebujesz zaokrąglenia? Jeśli to zrobisz, zaokrąglenie wyniku zamiast wartości będzie bardziej Precyzja: – BatteryBackupUnit

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