我有一个客户数据库表:
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
答案 0 :(得分:1)
无法编写可由EF翻译成SQL的递归linq查询。所以你有两个选择。
答案 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但它可以工作