c#linq遍历来自数据库的层次结构数据

时间:2016-11-30 11:57:08

标签: c# entity-framework linq

我有一个客户数据库表:

Table:  
[Customer]

Fields:  
[Id] Integer  
[ParentId] Integer

除其他外,客户还有一个唯一的Id和一个ParentId,它指向创建它的客户。 因此,每个客户都可以拥有子客户,可以有子客户等。

ETC:

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

2 个答案:

答案 0 :(得分:1)

无法编写可由EF翻译成SQL的递归linq查询。所以你有两个选择。

  1. 在SQL中编写recursive Common Table Expression并将结果映射到您的实体。
  2. 将整个表放入内存并在代码中遍历它。

答案 1 :(得分:0)

这里适用于SQL服务器的东西

 var items = db.Database.SqlQuery<Table>(@"with [CTE] as (
        select * from [Table] c where c.[ParentId] = @id
        union all
        select c.* from [CTE] p, [Table] c where c.[ParentId] = p.[Id]
        and c.[ParentId] <> c.[Id]
    )
    select * from [CTE]", new SqlParameter("@Id", 1));
            var data = items.ToList();

你需要做原始的SQL但它可以工作