Как получить список распределения по возрасту по группам - PullRequest
1 голос
/ 23 апреля 2011

Я хочу вернуть список, который содержит данные, связанные с распределением по возрасту (например, для возрастов 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.

Как мне решить эту ошибку?Я знаю, что Entity Framework 4 не может перевести мое выражение в обычный старый SQL.Как я могу намекнуть, что я пытаюсь сделать?

Заранее спасибо:)

Ответы [ 4 ]

1 голос
/ 23 апреля 2011

Саид прав;лучший способ для этого - использовать каноническую функцию DiffYears через метод EntityFunctions.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() 
               };
1 голос
/ 23 апреля 2011

вы не можете сделать это в EF:

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

Вы можете использовать Канонические функции объекта для этой цели.

На самом деле вы не можете сделать DateTime1 - DateTime2 в EF.

0 голосов
/ 23 апреля 2011

Что делать, если вы преобразовали свои даты в числовые значения с помощью функции mydate.ToOADate()? Эта функция преобразует даты в двойное значение, где целая часть двойного числа представляет, какой это день, а дробная часть двойного представляет дробный день (т. Е. Время суток).

Я не знаю много об арифметике сущностей, но если бы даты были двойными, то это исключение может не возникать - просто предположение.

0 голосов
/ 23 апреля 2011

Я полагаю, что нужно изменить 365,25 на 365 (так что int похоже на свойство Days).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...