如何通过分组获得Age分发列表

时间:2011-04-23 14:32:23

标签: c# linq entity-framework-4

我想返回一个List,其中包含与Age Distribution相关的数据(例如,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。我怎么能暗示它我想做什么?

提前致谢:)

4 个答案:

答案 0 :(得分:1)

你不能在EF中这样做:

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

您可以将Entity canonical functions用于此目的。

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

答案 1 :(得分: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() 
               };

答案 2 :(得分:0)

我的猜测是将365.25更改为365(所以int属于Days属性。

答案 3 :(得分:0)

如果使用mydate.ToOADate()函数将日期转换为数值,该怎么办?此函数将日期转换为double值,其中double的整数部分表示它的当天,而double的小数部分表示小数日(即一天中的时间)。

我对实体算术知之甚少,但如果日期是双倍的,那么它可能不会抛出该异常 - 只是一个猜测。