Je possède une classe abstraite avec 3 autres classes qui héritent de cette classe :
public abstract class AbstractTask
{
[Key]
public int ID {get; set;}
[DisplayName("Tâche en vedette")]
public bool Featured { get; set; }
// diverses autres propriétés
}
public class HighLevelTask : AbstractTask
{
[DisplayName("Description du flux de travail")]
public String Workstream { get; set; }
public virtual ICollection MidLevelTasks { get; set; }
}
public class MediumLevelTask : AbstractTask
{
public int HighLevelTaskID { get; set; }
public virtual ICollection DetailLevelTasks { get; set; }
}
public class DetailLevelTask : AbstractTask
{
public int MidLevelTaskID { get; set; }
}
Ainsi, une tâche de haut niveau peut contenir un nombre quelconque de tâches de niveau intermédiaire et une tâche de niveau intermédiaire peut contenir un nombre quelconque de tâches de détail. Les tâches à tous les niveaux peuvent être définies comme "En vedette" par la propriété héritée de la classe abstraite.
Dans une vue HTML, je souhaite présenter une liste imbriquée des tâches "en vedette". Je pense donc à une action de contrôleur comme celle-ci pour collecter toutes les tâches "en vedette", mais je bloque mentalement sur la meilleure façon de présenter cela.
var qryHighLevelTasks = from t in context.HighLevelTasks
where t.Featured == true
select t;
var rsHighLevelTasks = qryHighLevelTasks.ToList();
foreach(var highLevelTask in rsHighLevelTasks)
{
// obtenir toutes les tâches intermédiaires en vedette liées à cette tâche de haut niveau
var qryMidTasks = from midLevelTasks in context.MidLevelTasks
where midLevelTasks.Featured == true
&& midLevelTasks.HighLevelTaskID == highLevelTask.ID
select midLevelTasks;
var rsMidLevelTasks = qryMidTasks.ToList();
foreach (var midLevelTask in rsMidLevelTasks)
{
// obtenir toutes les tâches de détail en vedette liées à cette tâche de niveau intermédiaire
var qryDetailTasks = from detailLevelTasks in context.DetailLevelTasks
where detailLevelTasks.Featured == true
&& detailLevelTasks.MidLevelTaskID == midLevelTask.ID
select detailLevelTasks;
var rsDetailLevelTasks = qryDetailTasks.ToList();
}
}
Peut-être devrais-je avoir un modèle composite pour représenter les tâches "en vedette" ? Ou y a-t-il une meilleure façon de faire ? Des recommandations ?