C# 如何通过分组获得年龄分布列表

C# 如何通过分组获得年龄分布列表,c#,linq,entity-framework-4,C#,Linq,Entity Framework 4,我想返回一个列表,其中包含与年龄分布相关的数据(例如,0-9岁有10人,10-19岁有7人等) 这是我的疑问:- public List<ReportHelper> GetAgeDistribution(int userId) { var itemList = (from item in this.ObjectContext.TreeMembers where item.UserId =

我想返回一个列表,其中包含与年龄分布相关的数据(例如,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;
        }
如何解决此错误?我知道EntityFramework4无法将我的表达式转换为普通的旧sql。我怎样才能暗示我要做什么


提前感谢:)

我的猜测是将365.25更改为365(因此它是一个
int
属性,类似于
Days
属性)。

您不能在EF中执行此操作:

DateTime.Now - (item.Birthdate ?? DateTime.Now))....
您可以为此目的使用


事实上,您不能在EF中执行
DateTime1-DateTime2

如果您使用
mydate.ToOADate()函数将日期转换为数值,会怎么样?此函数用于将日期转换为双精度值,其中双精度的整数部分表示日期,小数部分表示小数天(即一天中的时间)


我对实体运算知之甚少,但如果日期是双倍的,那么它可能不会抛出异常——只是猜测而已。

赛义德是对的;最好的方法是通过该方法使用规范的
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() 
               };

除非出生日期的类型为
DateTime?
否则您不需要
item.BirthDate??DateTime.Now
因为DateTime不可为空。@Zebi:-生日是DateTime吗?否则代码甚至无法编译。问题不属于任何可为null的类型。问题是EF无法将Linq转换为普通的旧sql
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() 
               };