2011-09-05 65 views
4

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

enter image description here

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

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

编辑: 基本上,我试图创建一个网络营销方案,并需要计算每个人的收入。

例子:

  1. 为了能够calulate特定用户根据每个用户的总销售额(因此每个用户将有某种形式的收入进来)。
  2. 在树一定水平计算佣金(例如,如果顶人有3人在他们下面$ 1每销售一个产品,佣金率为50%,那么将是$ 1.50)
  3. 如果我质疑上图中(左)为 “B” 我应该得到 “B,H,I,J,N,O”

希望帮助:S

+0

写一些例子你有什么exacly需要。 –

+0

@Piotr - 请参阅我的编辑 – Ryan

+1

查看[使用LINQ搜索树](http:// stackoverflow。com/questions/7062882/searching-a-tree-using-linq) – Eranga

回答

3

无法遍历整个树只使用LINQ的方式可以转换为单个SQL查询(或它们的常数)。您可以使用每个级别的一个查询或一个查询来完成此操作,这仅限于特定数量的级别(但这样的查询在许多级别上会变得非常大)。

在T-SQL中(我假设你使用的是MS SQL Server),你可以使用recursive common table expressions来做到这一点。应该可以将它放入一个存储过程,您可以使用它从LINQ获取您实际需要的信息。

综上所述,你的选择是:

  1. 不要使用LINQ,只需用递归CTE
  2. 使用递归CTE SQL存储过程从LINQ
  3. 使用LINQ,创建一个查询每个级别
  4. 使用丑陋的LINQ查询只限于几级
+0

这个递归CTE能够处理3^30 +级别的数据吗? – Ryan

+3

你真的意味着3^30的水平?这是一个非常巨大的数字。如果一个级别只需要一个字节,那么整棵树就会有187TB。 – svick

+0

好点...我可能不需要3^30,但可能更像3^16。这将是一个n-ary,所以它不会是完全3^16 +,但它可以得到那么高...顺便说一句,我只是用3^10试了一下,查询花了8分钟以上运行。 – Ryan