【问题标题】:Entity Framework and self-referencing table实体框架和自引用表
【发布时间】:2014-09-30 16:40:56
【问题描述】:

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

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

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

编辑: 我基本上是在尝试创建一个网络营销场景,并且需要计算每个人的收入。

例子:

  1. 能够计算特定用户下每个用户的总销售额(因此每个用户都会有某种收入)。
  2. 在树的某个级别计算佣金(例如,如果最上面的人有 3 个人在他们下面,每个人以 1 美元的价格销售一种产品,而佣金为 50%,那么将有 1.50 美元。)
  3. 如果我在上面(左侧)的图像中查询“B”,我应该得到“B,H,I,J,N,O”

希望对你有所帮助:S

【问题讨论】:

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


【解决方案1】:

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

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

总而言之,您的选择是:

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

【讨论】:

  • 这个递归 CTE 是否能够处理 3^30+ 级别的数据?
  • 你真的是指 3^30 关卡吗?这是一个非常庞大的数字。如果一个级别只占用一个字节,那么整个树将有 187 TB。
  • 好点...我可能不需要 3^30 但可能更像 3^16。这将是一个 n 元,因此它不会完全是 3^16+,但它可以达到那么高......顺便说一句,我刚刚用 3^10 尝试过,查询需要 8+ 分钟才能运行。
【解决方案2】:

我知道这已经晚了,但是如果您查看有向图算法,您可以绕过递归问题。看看这两篇文章:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多