Сначала я покажу свой случай, чтобы объяснить вопрос - я создал архитектуру ролей и задач в SQL Server, которая выглядит следующим образом:
У меня есть 2 основные таблицы, Roles и Tasks, и 2 таблицы ссылок.
Я создал эту модель (с помощью генератора Entity Framework) для классов Entity Framework на C# и получил эти классы:
public class Task
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Role> Roles { get; set; }
public virtual ICollection<Task> ChildTask { get; set; }
public virtual ICollection<Task> ParentTask { get; set; }
}
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
}
Теперь я хочу получить имена всех задач одной роли, и у меня возникают проблемы, потому что задача имеет собственную иерархию.
Могу ли я сделать это с использованием структуры сущностей и не перебирать каждый дочерний элемент вручную / хранимую процедуру SQL Server?
Спасибо.
Я пытаюсь получить все связанные имена задач для данной роли. Так, например, Role.Task даст мне прямую связанную задачу, но связанная задача может иметь дочернюю задачу (Role.Task.ChildTask), а дочерняя задача может иметь еще несколько ChildTask (Role.Task.ChildTask.ChildTask) И я хочу чтобы получить все свойство Name задачи, например, во всей этой иерархии для данного идентификатора роли
Почему вы здесь используете отношения "многие ко многим"? Может ли у задачи действительно быть много родительских задач и много ролей?
Да, задача может быть дочерней по отношению к нескольким другим задачам, а у родительской задачи может быть много дочерних задач. То же самое для роли, может быть много связанных задач, и одна задача может быть связана со многими ролями.





Вы можете сделать это рекурсивно с помощью LazyLoading:
public List<string> GetTaskNames(Task task, List<string> tasks = null)
{
if (tasks == null);
tasks = new List<string>();
tasks.Add(task.Name);
foreach(var child in task.ChildTask)
GetTaskNames(child, tasks);
return tasks;
}
var role = context.Roles.Find(roleId);
var names = role.Tasks.SelectMany(x => GetTaskNames(x)).Distinct().ToList();
Не могли бы вы пояснить, что вы имеете в виду, говоря «у меня проблемы»? Вы должны быть в состоянии получить задачи роли с помощью
Role.Tasks. Чего вы пытаетесь достичь?