2009-08-31 18 views
5
  • ¿Cómo obtener un tiempo promedio de un campo Fecha y hora a través de Entity Framework?
  • ¿Cómo restar una fecha de otra?

Estoy pensando en algo como:obtener el promedio Fecha y hora de la base de datos y restar una Fecha de otra

ObjectQuery<Visit> visits = myentitys.Visits; 
      var uQuery = 
      from visit in visits 
      group visit by visit.ArrivalTime.Value.Day into g 
      select new 
      { 
       Day = g.Key, 
       Hours = g.Average(visit => (visit.LeaveTime.Value - visit.ArrivalTime.Value).TotalMinutes) 
      }; 

para obtener el tiempo medio de permanencia de un visitante agrupados por día.

Respuesta

1

Prefiero obtener datos de la base de datos, y luego hacer la función promedio en la memoria. Altough No estoy seguro de lo que podría ser el impacto en perfomances ...

  List<Visit> visits = myentitys.Visits.ToList();//Get the Visits entities you need in memory, 
              //of course,you can filter it here 
      var uQuery = 
      from visit in visits 
      group visit by visit.ArrivalTime.Value.Day into g 
      select new 
      { 
       Day = g.Key, 
       Hours = g.Average(visit => (visit.LeaveTime.Value - visit.ArrivalTime.Value).TotalMinutes) 
      }; 

Este tipo de operación aritmética no es posible traducir en la consulta SQL (como excepción dice: argumentos DbArithmeticExpression deben tener un tipo común numérico), pero es posible con objetos en la memoria.

Espero que esto ayude.

+1

Prefiero esto también; no te estás atando a las funciones de SQL. No estoy seguro de por qué te rechazaron. –

+0

+ 1, @ Kirk +1, prefiero saber por última vez acerca de las opciones que no son necesarias para el servidor sql. – Maslow

7

Así es como se hace esto, suponiendo que su almacén de respaldo es SQL Server. Por cierto, corregí lo que supongo que fue un error tipográfico: asignas una cantidad total de minutos a un campo llamado Horas. Cambié el nombre del campo a Minutos para los propósitos de audiencias futuras.

ObjectQuery<Visit> visits = myentitys.Visits; 
var uQuery = from visit in visits 
      group visit by visit.ArrivalTime.Value.Day into g 
      select new 
      { 
       Day = g.Key, 
       Minutes = g.Average(visit => System.Data.Objects.SqlClient.SqlFunctions.DateDiff("m", visit.LeaveTime.Value, visit.ArrivalTime.Value)) 
      }; 

Es decepcionante que LINQ a Entidades no admite conversión intrínseca de DateTime sustracción en una DateDiff y luego dió un objeto TimeSpan como resultado.

+0

+1 respuesta útil. – Maslow

+1

+1 para "Es decepcionante que LINQ to Entities no sea compatible con la conversión intrínseca de DateTime" – billy