2010-06-21 24 views
5

Tengo una tabla de base de datos que contiene entradas para la hora de inicio y la hora de finalización de un evento. Me gustaría tomar esas entradas y encontrar la duración promedio de un evento. La resta no es un problema. Sin embargo, cuando intento obtener el valor promedio, el compilador se queja.LINQ Average TimeSpan?

Aquí está mi actual consulta LINQ:

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

También probé .sum() y .Aggregate() para que yo pudiera tener algo con que trabajar, pero no son aceptados.

¿Cuál es el mejor método para lograr mi objetivo?

+1

¿Cómo funciona exactamente el compilador se quejan? –

+0

¿Cuál es el error del compilador que obtienes? –

+0

System.LINQ.IQueryable No contiene una definición para 'Promedio' –

Respuesta

6

Parece que usted tiene que utilizar un SqlMethods.DateDiff en la declaración linq2sql (función DATEDIFF si SQL):

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

¡Está en lo correcto! Esto funciona muy bien. El único cambio necesario es que TimeEnd es lo primero. –

5

Average no funciona con TimeSpan valores, que es lo que obtienes al restar dos valores de DateTime. Intente promediar (EventTime.TimeEnd - EventTime.TimeStart).TotalMilliseconds y luego vuelva a convertirlo en un TimeSpan.

+0

Excelente. Este trabajó para mí. Tenía una lista de objetos TimeSpan para averigarse, y su sugerencia funcionó: TimeSpan avg = new TimeSpan (TimeSpan.TicksPerMillisecond * (long) System.Math.Round (ProcessElementTimes.Select (time => time.TotalMilliseconds) .Average(), 0)); –

+0

@David: Podría simplificarlo a 'TimeSpan.FromTicks (ProcessElementTimes.Average (x => x.Ticks);' Además, ¿realmente necesita el redondeo? Si lo hace, redondeando el resultado en lugar de cada valor sería más preciso. – BatteryBackupUnit

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