如何为分层数据构建自引用模型

时间:2012-04-25 09:00:17

标签: asp.net database linq

我正在尝试从db表中获取名为

的数据

部门

标识 名称 的ParentId

我想在下拉列表中创建层次结构视图,以便在部门之间进行选择 我想用linq检索数据并将其绑定到下拉列表 有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

http://www.scip.be/index.php?Page=ArticlesNET18

为我工作

好文章

GetEmployeesHierarchy()方法

我首先开始创建一个新的EmployeeHierarchy类。该类包含一个Employee实体(老板)和一组子雇员。

public class EmployeeHierarchy
{
  public Employee Employee { get; set; }
  public IEnumerable<EmployeeHierarchy> Employees { get; set; }
}

在.NET 3.5中,我们可以使用LINQ。所以我创建了一个递归的GetEmployeesHierachy函数,该函数将从Director(不必向任何人报告,ReportsTo = null)开始,并查询为他工作的所有员工(ReportsTo == EmployeeId of boss)。这将以递归方式重复。最后,此函数将返回EmployeeHierarchy对象的集合。

public IEnumerable<EmployeeHierarchy> GetEmployeesHierachy(IEnumerable<Employee> allEmployees, Employee parentEmployee)
{
  int? parentEmployeeId = null;

  if (parentEmployee != null)
    parentEmployeeId = parentEmployee.EmployeeID;

  var childEmployees = allEmployees.Where(e => e.ReportsTo == parentEmployeeId);

  Collection<EmployeeHierarchy> hierarchy = new Collection<EmployeeHierarchy>();

  foreach (var emp in childEmployees)
    hierarchy.Add(new EmployeeHierarchy() { Employee = emp, Employees = GetEmployeesHierachy(allEmployees, emp) });

  return hierarchy;
}

可以在LINQ to SQL或LINQ to Entities(实体框架)查询之后调用此函数。确保调用ToList()扩展方法。首先从数据库加载所有数据然后将其转换为层次结构更加高效。通过调用ToList()方法,将删除对数据库的所有引用。

NorthWindDataContext dc = new NorthWindDataContext();

var employeesHierarchy = GetEmployeesHierachy(dc.Employees.AsEnumerable(), null);

treeViewEmployees.ItemsSource = employeesHierarchy;