使用LINQ从数据库检索树结构

问题描述:

我有一个存储在数据库中的组织结构图树结构。 是有点像使用LINQ从数据库检索树结构

ID (int); 
Name (String); 
ParentID (int) 

在C#中它表示一类像

class Employee 
{ 
int ID, 
string Name, 
IList < Employee> Subs 
} 

我想知道是如何从数据库中检索这些值使用,填补了C#对象的最佳方式LINQ(我正在使用实体框架)

必须有一些比打电话来获得*然后重复调用以获得潜艇等更好的东西。

如何最好地做到这一点?

我想为实体添加一个字段以包含父ID,然后将整个表拖入内存中,使List subsub为null。然后通过对象迭代遍历对象并使用linq将对象填充到列表中。只有一个数据库查询应该是合理的。

+0

我发现这样做是像 的foreach(在所有位置的位置) { 的foreach的方式(在所有的位置位置1) { 如果(position1.ParentPositionID == position.ID) { 如果(position.Subs == NULL){ position.Subs =新名单(); } position.Subs.Add(position1); } } } 有没有更好的方法? – Emad 2010-01-08 20:02:10

实体框架查询应该让你有相关的实体集,但在一元关系,不知道它将如何工作...

检查了这一点的详细信息,即:http://msdn.microsoft.com/en-us/library/bb896272.aspx

那么...即使使用LINQ,你也需要两个查询,因为任何单个查询都会复制主要员工,因此会导致创建多个员工(实际上是相同的)......但是,您可以稍微隐藏一点linq当你创建对象的时候,那就是当你执行第二个查询时,像这样的:

var v = from u in TblUsers 
     select new { 
      SupervisorName = u.DisplayName, 
      Subs = (from sub in TblUsers where sub.SupervisorID.Value==u.UserID select sub.DisplayName).ToList() 
     }; 

  1. 您可以构建一个内置递归的存储过程。看看http://msdn.microsoft.com/en-us/library/ms190766.aspx了解SQL Server中公用表表达式的更多信息
  2. 您可能想要找到一种不同的(更好的?)方式来建模数据。 http://www.sqlteam.com/article/more-trees-hierarchies-in-sql列出了在数据库中建模分层数据的流行方式。更改建模可以让您创建可以不递归表达的查询。

如果您使用SQL Server 2008,则可以使用new HIERARCHYID功能。

组织在过去 挣扎,树像 结构在数据库中的表现,很多 加入大量复杂的逻辑进入 的地方,无论是组织 层次或定义BOM(比尔 材料)其中一件成品 依赖于另一半成品 材料/套件物品和这些套件 物品依赖于另一半成品 成品或原材料。

SQL Server 2008有解决 我们整个 层次存储的数据类型 HIERARCHYID问题。 HierarchyID是一个变量 长度系统数据类型。HIERARCHYID 用于定位在 层次像斯科特元素的位置是 首席执行官马克以及拉维 报告斯科特和本和劳拉 马克,维杰,詹姆斯报告和弗兰克 拉维报告。

因此,使用可用的新功能,只需返回不需要使用LINQ的数据。缺点是,你需要使用UDF或存储过程的任何东西超越了简单的根查询:

SELECT @Manager = CAST('/1/' AS hierarchyid)   
SELECT @FirstChild = @Manager.GetDescendant(NULL,NULL)