【问题标题】:C# Entity Framework recursive hierarchy queryC# Entity Framework 递归层次结构查询
【发布时间】:2018-09-03 14:26:26
【问题描述】:

我将首先展示我的案例以解释问题 - 我在 SQL Server 中创建了一个角色和任务架构,如下所示:

我有 2 个主表,RolesTasks,以及 2 个链接表。

我已经在 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.Tasks 获得角色的任务。你想达到什么目的?
  • 我正在尝试获取给定角色的所有相关任务名称。因此,例如 Role.Task 会给我直接相关的任务,但相关的任务可以有子任务(Role.Task.ChildTask),而子任务可以有另一个多个子任务(Role.Task.ChildTask.ChildTask),我想要获取任务的所有 Name 属性,例如在给定角色 id 的所有这些层次结构中
  • 为什么在这里使用多对多关系?一个任务真的可以有很多父任务和很多角色吗?
  • 是的,一个任务可以是多个其他任务的子任务,并且父任务有许多子任务。角色也是一样,可以有多个链接任务,一个任务可以链接多个角色

标签: c# sql-server entity-framework entity-framework-6


【解决方案1】:

您可以在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();

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2015-12-24
    • 1970-01-01
    • 2013-11-22
    • 2017-02-04
    相关资源
    最近更新 更多