Как правильно организовать (Мои) Задачи на занятиях.(upcast - проблема downcast) - PullRequest
0 голосов
/ 05 мая 2019

У меня есть класс Курс , который содержит 4 одинаковых набора классов (VideoTask, QuizTask, TextTask, QuestionTask), также у них есть базовый класс Task.Each Задача принадлежит к Topic (от TopicId), а также имеет свойство Order (потому что мне нужно сохранить порядок задач в каждой теме).

Course.cs

public class Course: INamedEntity
{
  public string Name { get; set; }
  public int Id { get; set; }


  public  ICollection<Topic> Topics { get; set; }


  public  ICollection<QuizTask> QuizTasks { get; set; }

  public  ICollection<QuestionTask> QuestionTasks { get; set; }

  public virtual ICollection<TextTask> TextTasks { get; set; }

  public ICollection<VideoTask> VideoTasks { get; set; }


}

Пример задачи

public class VideoTask : Task
{
  public int TopicId { get; set; }
  public int Order { get; set; }

  public string VideoUrl { get; set; }
}

Мой вопрос - как наилучшим образом организовать эту структуру? Потому что сейчас я должен делать «ужасные» вещи, такие как:

Получить эти задания отдельно от EF и затем перенести их в коллекцию:

public IEnumerable<Task> GetTasksOfCourse(TaskFilter filter)
{
  var course = GetFullCourse(filter.CourseId);

  List<Task> tasks = new List<Task>();
  tasks.AddRange(course.QuestionTasks.Where(t=>t.TopicId == filter.TopicId));
  tasks.AddRange(course.QuizTasks.Where(t => t.TopicId == filter.TopicId));
  tasks.AddRange(course.TextTasks.Where(t => t.TopicId == filter.TopicId));
  tasks.AddRange(course.VideoTasks.Where(t => t.TopicId == filter.TopicId));

  return tasks;
}

И затем, прямо в виде, я должен вернуть их обратно:

@model IEnumerable<Task>

@foreach (var task in Model)
{
    if (task is QuestionTask)
    {
        @await Html.PartialAsync("Partial/_QuestionTask", (QuestionTask)task)
    }
    if (task is QuizTask)
    {
        @await Html.PartialAsync("Partial/_QuizTask", (QuizTask)task)
    }
    if (task is TextTask)
    {
        @await Html.PartialAsync("Partial/_TextTask", (TextTask)task)
    }
    if (task is VideoTask)
    {
        @await Html.PartialAsync("Partial/_VideoTask", (VideoTask)task)
    }
}

Все это выглядит ужасно, но я не знаю, что делать.

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