Рассмотрим следующие упрощенные объекты и отношения:
public class Job{
int JobId;
String name;
String status;
Discipline disc;
WorkCategory workCat;
}
public class Discipline {
int DisciplineId;
String DisciplineName;
}
public class Workcategory{
int WorkCategoryId;
String WorkCategoryName;
}
public Class Grouping{
Discipline parent;
List<Workcategory> children;
}
Приведенное выше моделирует отношение, в котором Job
связан с одним Discipline
и одним WorkCategory
. Workcategory
всегда является потомком определенного родителя Discipline
(отношение один-ко-многим). Мы можем предположить, что отношения назначенной Дисциплины и Рабочей категории всегда будут действительными.
Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь создать объект результата Grouping
на основе фильтров, которые применяются к Jobs
. Я не уверен, что это можно сделать или подход, который я использую, является даже правильным. Точный вопрос сам по себе мне неясен, однако вышеизложенное определяет постановку задачи.
- Можно ли улучшить дизайн?
- Как сгруппировать вакансии по дисциплинам и категориям работы?
- Мне вообще нужен класс
Grouping
?
Я попробовал следующее (это моя первая попытка с использованием Linq), но безуспешно, так как мое понимание недостаточно полно. Другая альтернатива - сначала получить группу Discipline
и перебрать исходную группу, выбрав соответствующую Workcategory
.
var grouping = repository.GetJobsWithActiveStatus()
.GroupBy(x => new {
x.Discipline.DisciplineID,
x.Discipline.DisciplineName,
x.Category.WorkCategoryID,
x.Category.WorkCategoryName
})
.Select(g => new Grouping{
Discipline = new Discipline{
DisciplineID = g.Key.DisciplineID,
Name = g.Key.DisciplineName
},
Categories = ?? // this is where I am lost
}});
Edit:
После публикации я понял, что исходные параметры GroupBy приводят к одной группе элементов, тогда как я ищу результат Group-SubGroup.
Редактировать 2:
Чтобы пояснить немного дальше, я не хочу, чтобы связанные Задания были частью результата, а скорее группировка Дисциплина-Рабочая категория - таким образом, причина для Grouping
класса
Исходное решение на основе @ Obalix
Изменить 7 марта 2010 г .:
Это решение не работает - GroupBy для объекта Discipline создаст уникальную группировку для каждого объекта. Я думаю, что это связано с тем, что это ссылочный тип. Я прав?
Первоначально я принял это как ответ, однако после того, как почесал голову, понял, что мои фиктивные данные сами по себе были ошибочными. Первоначальные вопросы все еще остаются без ответа.
var result = repository.GetJobsWithActiveStatus()
.GroupBy(x => x.disc)
.Select(g => new Grouping
{
Discipline = g.Key,
Catergories = g.GroupBy(x=>x.workCat) // <--- The Problem is here, grouping on a reference type
.Select(l=>l.Key) // needed to select the Key's only
.ToList()
});