Группировка внутри группы с помощью EntityFramwork в Mvc5 - PullRequest
0 голосов
/ 13 декабря 2018

Привет, ребята. Я пытаюсь привести счетчик для каждого мужчины и женщины по возрасту. Как в таблице здесь

Мне удалось вычислить все возрасты, но я не могу сосчитатьвозраст как мальчики и девочки.Я хочу помочь, пожалуйста

вот мой код в контроллере

public ActionResult AllCuont()
{

    var query = (from t in db.Pations
                 let range = (
                              t.Age>= 1 && t.Age < 5 ? "age from 1 to 4" :                                      
                              t.Age >= 5 && t.Age < 15 ? "age from 5 to 14" :
                              t.Age >= 15 && t.Age < 25 ? "age from 15 to 24" :
                              t.Age >= 25 && t.Age < 45 ? "age from 25 to 44" :
                              ""
                              )
                 group t by range into g


                 select new UserRange { AgeRange = g.Key,  Count = g.Count() }).ToList();
    //add the sum column.
    query.Add(new UserRange() { AgeRange = "Sum",Count = query.Sum(c => c.Count) });

    ViewBag.UserData = query;

    return View(db.Pations);
}

и мой модальный пион как это

   namespace app.Models
{
    public class Pation
    {
        [Key]
        public int Id { get; set; }

        public string PationName { get; set; }

        public int Age { get; set; }
        public Sex Sex { get; set; }

        public ApplicationUser User { get; set; }

    }
    public enum Sex
    {
        boys,
        girls,
    }
}

и это модально для подсчета моего значения

   public class UserRange
    {
        public string AgeRange { get; set; }
        public int Count { get; set; }

    }

как рассчитывать для каждого мужчины и женщины по возрасту

1 Ответ

0 голосов
/ 13 декабря 2018

Мне не ясно, что вы хотите поместить в ряды вашей картинки.Pations?Таким образом, один столбец может иметь больше строк, чем другой столбец?А что вы хотите поместить в свой последний столбец?

В любом случае, у вас есть последовательность Pations (Пациенты?), И вы хотите разделить их на группы Pations с равным возрастным диапазоном,Каждая группа того же возрастного диапазона должна быть разделена на группу Pations с равным Sex.

Итак, давайте сначала дадим каждый Pation и возрастной диапазон.По соображениям эффективности я перечислю ваши возрастные диапазоны от нуля до четырех, позже я изменю возрастные диапазоны на текст

var query = dbContext.Pations                   // from the table of Pations
    .Where(patient => patient.Age < 45)         // keep only the Patiens younger than 45
    .Select(patient => new                      // from every remaining patient,
    {                                           // make one new object
         AgeRange = (patient.Age < 5) ? 0 :
                    (patient.Age < 15) ? 1 :
                    (patient.Age < 25) ? 2 : 3, // with a number 0..3, indicating the age range
         Gender = patient.Sex,                  // a property indicating the gender

         Patient = patient,                     // and the original Patient
    })

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

Каждая группа состоит из пациентов одного и того же возрастного диапазона.Я разделю каждую группу на подгруппу мальчиков и подгруппу девочек.Подсчитывается количество элементов в каждой подгруппе.

    .GroupBy(patient => patient.AgeRange,       // group into groups of equal age range
    (ageRange, patientsWithThisAgeRange) => new // from the common ageRange and all
    {                                           // patients with this ageRange make one new
        AgeRange = ageRange,                   // remember the ageRange

        // put all Boys in this agegroup in a separate subgroup
        BoysGroup = patientsWithThisAgeRange                       
            .Where(patientWithThisAgeRange => patientWithThisAgeRange.Gender == Sex.Boys)
            .ToList(),

         // put all Girls in a separate sub group

        GirlsGroup = patientsWithThisAgeRange    // count number of girls in this group
            .Where(patientWithThisAgeRange => patientWithThisAgeRange.Gender == Sex.Girls)
            .ToList(),
    })

Благодаря списку ToList у вас будет как парни, так и парни.Если вам не нужны мальчики и девочки в конечном результате, а только количество мальчиков, замените ToList на Count

Наконец, переместите все данные из вашей системы управления базами данных в локальный процесс и преобразуйтевозрастная группа в текст:

    .AsEnumerable()
    .Select(group => new
    {
        Description = AgeRangeToText(group.AgeRange),
        NrOfBoys = group.NrOfBoys,
        NrOfGirls = group.NrOfGirls,
    });

Единственное, что вам нужно сделать, это написать функцию, которая преобразует ваши ageRanges 0..4 в надлежащие тексты.

...