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