2009-08-31 17 views
5
  • Jak uzyskać średni czas z pola Datetime za pośrednictwem Entity Framework?
  • Jak odjąć jedną datę od innej?

Mam na myśli coś takiego:Uzyskaj średnią Datetime z DB i odejmij jedną datę od innej

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) 
      }; 

aby średni czas przebywania na odwiedzającego spis Day.

Odpowiedz

1

Wolę pobierać dane z bazy danych, a następnie wykonywać przeciętne funkcje w pamięci. Mimo, że nie jestem pewien, co mogłoby mieć wpływ na 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) 
      }; 

Ten rodzaj operacji arytmetycznej nie jest możliwe do przetłumaczenia w zapytaniu SQL (jak mówi wyjątek: argumenty DbArithmeticExpression musi mieć wspólny typ liczbowy) ale jest to możliwe z obiektami w pamięci.

Mam nadzieję, że to pomoże.

+1

Ja też to lubię; nie przywiązujesz się do funkcji SQL. Nie wiem, dlaczego przegłosowano. –

+0

+ 1, @ Kirk +1, wolałbym nareszcie wiedzieć o wymaganych opcjach wymaganych przez serwer inny niż sql. – Maslow

7

Oto, jak to zrobić, zakładając, że Twoim zapleczem jest SQL Server. Przy okazji poprawiłem to, co zakładam, było literówką - przypisujesz całkowitą liczbę minut do pola o nazwie Godziny. Zmieniono nazwę tego pola na Minutes na potrzeby przyszłych odbiorców.

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)) 
      }; 

jest rozczarowujące, LINQ podmioty nie obsługuje wewnętrznej konwersji DateTime odejmowania do DateDiff i uzyskania obiektu TimeSpan wyniku.

+0

+1 przydatna odpowiedź. – Maslow

+1

+1 dla "Rozczarowuje to, że LINQ do Entities nie obsługuje wewnętrznej konwersji DateTime" – billy