【发布时间】:2016-11-30 21:48:40
【问题描述】:
我有一个包含客户的数据库表:
Table:
[Customer]
Fields:
[Id] Integer
[ParentId] Integer
除其他外,客户有一个唯一的 Id 和一个指向创建它的客户的 ParentId。 所以,每个客户都可以有子客户,谁可以有子客户等等。
等等:
Customer{ Id = 1, ParentId = 1 } //Root customer
Customer{ Id = 123, ParentId = 1}
Customer{ Id = 456, ParentId = 1}
Customer{ Id = 789, ParentId = 1}
Customer{ Id = 321, ParentId = 123 }
Customer{ Id = 654, ParentId = 123 }
Customer{ Id = 987, ParentId = 789 }
Customer{ Id = 1010, ParentId = 987 }
我使用 EF 和 LINQ 来查询我的数据。
我需要的是一个 LINQ 查询,以基于一个 Id 将所有 Id 展平。
例如:
ID 1 将返回所有 ID。
ID 123 将返回 321 和 654
ID 789 将返回 987 和 1010
【问题讨论】:
-
为什么一定要 linq?
-
@ThePerplexedOne - 因为他正在寻找递归子代:789 -> 987 -> 1010
-
递归链接很难用 sql 来做,因为 EF linq 只是被翻译成 SQL,你需要考虑如何去做there。存储过程或视图可能是最好的选择。或者您可以将所有内容都拉到内存中并在那里执行。
-
如果你问我,在 EF 中使用自引用 ParentId 而不是可为空的 root 是一种痛苦。至于问题:加载额外实体和执行多个查询之间的权衡是什么?也许看看this answer I recently wrote 另一个问题。基本上,获取层次结构,然后遍历它进行展平。
-
使用所有受支持的 SQL Server 版本中都可用的
hierarchyid列,而不是自引用。该列可以被索引,使子检索非常快。
标签: c# entity-framework linq