2009-08-31 128 views
5
  • 如何通過實體框架從日期時間字段獲取平均時間?
  • 如何從另一箇中減去一個日期?

我想到的是這樣的:從DB獲取平均日期時間並從另一個日期時間減去一個日期

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

獲得由天分組的遊客的平均停留時間。

回答

1

我寧願從數據庫中獲取數據,然後在內存中做平均函數。 Altough我不知道這可能是對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) 
      }; 

這種運算是不可能在SQL查詢翻譯(如異常說:DbArithmeticExpression參數必須有一個數字普通型),但它可能與內存中的對象有關。

希望這會有所幫助。

+1

我更喜歡這個;你並沒有把自己綁定到SQL函數上。我不確定你爲什麼被拒絕。 – 2010-03-08 10:05:49

+0

+ 1,@柯克+1,我寧願在有關非SQL服務器所需的選項最後知道的好。 – Maslow 2010-11-06 14:29:53

7

這是你如何做到這一點,假設你的後備存儲是SQL Server。順便說一下,我糾正了我認爲是一個錯字 - 您將總分鐘數分配到一個名爲Hours的字段中。爲了未來受衆的目的,我將該字段重命名爲Minutes。

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

令人失望的是LINQ實體不支持的DateTime減法的固有轉換成則DateDiff然後產生時間間隔對象作爲結果。

+0

+1有用的答案。 – Maslow 2010-11-06 14:31:24

+1

對於「令人失望的是LINQ to Entities不支持DateTime的內在轉換」 – billy 2011-06-21 17:22:13