2011-04-23 44 views
1

我想返回一個列表,其中包含與年齡分佈有關的數據(例如,對於年齡0-9,有10人,對於10-19,有7人等)如何通過分組得到年齡分佈列表

這是我的查詢: -

public List<ReportHelper> GetAgeDistribution(int userId) 
     { 
      var itemList = (from item in this.ObjectContext.TreeMembers 
          where item.UserId == userId 
          group (DateTime.Now - (item.Birthdate ?? DateTime.Now)).Days/365.25 
          by ((DateTime.Now - (item.Birthdate ?? DateTime.Now)).Days/365.25)/9); 

      List<ReportHelper> list = new List<ReportHelper>(); 

      foreach (var item in itemList) 
       list.Add(new ReportHelper { Data = item.Count(), Label = item.Key + "-" + (item.Key + 9) }); 


      return list; 
     } 

當我運行此查詢我得到dbarithmeticexpression例外:

DbArithmeticExpression arguments must have a numeric common type. 

我怎麼解決這個問題?我知道實體框架4無法將我的表達式轉換爲普通的舊sql。我怎樣才能暗示我想要做什麼?

感謝提前:)

+0

除非出生日期是類型'日期時間'你不需要'item.Birthdate ??? DateTime.Now'因爲DateTime不可爲空。 – Zebi 2011-04-23 14:36:35

+0

@Zebi: - BirthDate是DateTime?否則代碼將不會編譯。問題不是任何可空類型。問題是EF無法將Linq轉換爲普通的舊SQL – TCM 2011-04-23 14:45:59

回答

1

賽義德是對的;最好的方法是通過EntityFunctions.DiffYears方法使用規範DiffYears函數。

此外,您將年齡劃分爲桶[0 - 9]年,[10 - 19]年等的邏輯似乎不正確;您應該將完整年除以10而不是9

此查詢應該很好地工作:

var itemList = from item in this.ObjectContext.TreeMembers 
       where item.UserId == userId 
       let age = EntityFunctions.DiffYears 
           (item.Birthdate, DateTime.Now) ?? 0 
       group item by age/10 into ageGroup 
       select new 
       { 
        AgeInCompletedDecades = ageGroup.Key, 
        Count = ageGroup.Count() 
       }; 
0

我的猜測是改變365.25到365(所以它是一個intDays屬性)。

1

你不能在EF做到這一點:

DateTime.Now - (item.Birthdate ?? DateTime.Now)).... 

您可以使用Entity canonical functions用於此目的。

事實上,你不能在EF中做DateTime1 - DateTime2

0

如果使用mydate.ToOADate()函數將日期轉換爲數值,該怎麼辦?該函數將日期轉換爲double值,其中double的整數部分表示它是哪一天,double的小數部分表示分數日(即一天中的時間)。

我不太瞭解實體算術,但如果日期是雙打的,那麼它可能不會拋出異常 - 只是一個猜測。