实体框架和自引用表

时间:2011-09-05 07:15:46

标签: c# database entity-framework tree entity-framework-4.1

我需要一个以一个名为“User”的表开头的数据库,该表需要自我引用,并且会有一个非常深的相关对象图。它需要像下面图像的左侧(忽略右侧)。

enter image description here

我还需要向上和向下遍历此图表以计算百分比,总数等。换句话说,在某些情况下我需要遍历整个图表。

这可能和/或它是如何完成的?可以在LINQ语句中直接进行遍历吗?实例

修改 我基本上是在尝试创建网络营销方案,需要计算每个人的收入。

示例:

  1. 能够计算特定用户下每个用户的总销售额(因此每个用户都会有某种收入)。
  2. 计算树木某一级别的佣金(例如,如果顶级人员下面有3人,每人以1美元的价格销售产品,佣金为50%,则会有1.50美元。)
  3. 如果我查询上面(左边)的图像为“B”,我应该得到“B,H,I,J,N,O”
  4. 希望这有助于:S

2 个答案:

答案 0 :(得分:3)

您不能仅使用LINQ遍历整个树,这种方式可以转换为单个SQL查询(或者它们的常量计数)。您可以使用每个级别的一个查询或一个查询来执行此操作,该查询仅限于特定的级别计数(但是这样的查询会在很多级别上变得非常大)。

在T-SQL中(我假设您使用的是MS SQL Server),您可以使用recursive common table expressions执行此操作。应该可以将它放入一个存储过程,您可以从LINQ使用它来获取您真正想要的信息。

总而言之,您的选择是:

  1. 不要使用LINQ,只使用带递归CTE的SQL
  2. 在LINQ
  3. 的存储过程中使用递归CTE
  4. 使用LINQ,为每个级别创建一个查询
  5. 使用丑陋的LINQ查询仅限于几个级别

答案 1 :(得分:0)

我知道这已经很晚了,但如果你看一下Directed Graph算法,你可以绕过递归问题。看看这两篇文章:

http://www.sitepoint.com/hierarchical-data-database/

http://www.codeproject.com/Articles/22824/A-Model-to-Represent-Directed-Acyclic-Graphs-DAG-o