C # Entity Framework рекурсивный иерархический запрос - PullRequest
0 голосов
/ 02 сентября 2018

Сначала я покажу свой случай, чтобы объяснить вопрос - я создал архитектуру ролей и задач в SQL Server, которая выглядит следующим образом:

enter image description here

У меня есть 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?

Спасибо.

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете сделать это рекурсивно с помощью 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();
...