使用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将对象填充到列表中。只有一个数据库查询应该是合理的。
实体框架查询应该让你有相关的实体集,但在一元关系,不知道它将如何工作...
检查了这一点的详细信息,即: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()
};
- 您可以构建一个内置递归的存储过程。看看http://msdn.microsoft.com/en-us/library/ms190766.aspx了解SQL Server中公用表表达式的更多信息
- 您可能想要找到一种不同的(更好的?)方式来建模数据。 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)
我发现这样做是像 的foreach(在所有位置的位置) { 的foreach的方式(在所有的位置位置1) { 如果(position1.ParentPositionID == position.ID) { 如果(position.Subs == NULL){ position.Subs =新名单(); } position.Subs.Add(position1); } } } 有没有更好的方法? –
Emad
2010-01-08 20:02:10