C# 基于级联表的SQL查询

C# 基于级联表的SQL查询,c#,sql-server,linq,entity-framework,C#,Sql Server,Linq,Entity Framework,首先,我使用Linq和实体框架来创建查询 我有6张桌子,它们以级联方式相互依赖。 因此,表中的数据布局如下所示: Table 1: Id , Name Table 2: Id , Table1Id, Name Table 3: Id , Table2Id, Name ... var databaseLevel = (from lev1 in db.Level1s select new { Level1 = lev1, Level2 = (Level2s)null, Level

首先,我使用Linq和实体框架来创建查询

我有6张桌子,它们以级联方式相互依赖。 因此,表中的数据布局如下所示:

 Table 1: Id , Name
 Table 2: Id , Table1Id, Name
 Table 3: Id , Table2Id, Name 
 ...
var databaseLevel =
    (from lev1 in db.Level1s select new { Level1 = lev1, Level2 = (Level2s)null, Level3 = (Level3s)null, Level4 = (Level4s)null, Level5 = (Level5s)null, Level6 = (Level6s)null })
    .Concat(from lev2 in db.Level2s select new { Level1 = lev2.Level1s, Level2 = lev2, Level3 = (Level3s)null, Level4 = (Level4s)null, Level5 = (Level5s)null, Level6 = (Level6s)null })
    .Concat(from lev3 in db.Level3s select new { Level1 = lev3.Level2s.Level1s, Level2 = lev3.Level2s, Level3 = lev3, Level4 = (Level4s)null, Level5 = (Level5s)null, Level6 = (Level6s)null })
    .Concat(from lev4 in db.Level4s select new { Level1 = lev4.Level3s.Level2s.Level1s, Level2 = lev4.Level3s.Level2s, Level3 = lev4.Level3s, Level4 = lev4, Level5 = (Level5s)null, Level6 = (Level6s)null })
    .Concat(from lev5 in db.Level5s select new { Level1 = lev5.Level4s.Level3s.Level2s.Level1s, Level2 = lev5.Level4s.Level3s.Level2s, Level3 = lev5.Level4s.Level3s, Level4 = lev5.Level4s, Level5 = lev5, Level6 = (Level6s)null })
    .Concat(from lev6 in db.Level6s select new { Level1 = lev6.Level5s.Level4s.Level3s.Level2s.Level1s, Level2 = lev6.Level5s.Level4s.Level3s.Level2s, Level3 = lev6.Level5s.Level4s.Level3s, Level4 = lev6.Level5s.Level4s, Level5 = lev6.Level5s, Level6 = lev6 })
     .AsQueryable(); 
现在我需要创建一个查询,其中所有这些结果都被连接起来并表示级联,但我还需要将结果保留在子元素存在的地方。我不知道这是否可以理解,因此举个例子:

Table 1:
1     Item1
2     Item2
3     Item3

Table 2:
1     1    Item1
2     1    Item2
3     2    Item3

Table 3:
1     1    Item1
2     3    Item2

Expected Queryresult:
Level1Id     Level1Name     Level2Id     Level2Name     Level3Id     Level3Name
________________________________________________________________________________
1            Item1          
1            Item1          1           Item1
1            Item1          1           Item1           1            Item1
1            Item1          2           Item2
2            Item2
2            Item2          3           Item3
2            Item2          3           Item3           2            Item2
查询结果不需要完全像这样,但必须具有hirchical顺序

我已经尝试使用左外部联接,但这只提供预期结果的叶子。 查询如下所示:

var databaseLevel =
 (from lev1 in db.Level1
  from lev2 in db.Level2.Where(x => x.Level1Id == lev1.Id).DefaultIfEmpty()
  from lev3 in db.Level3.Where(x => (x.Level2Id == lev2.Id)).DefaultIfEmpty()
  from lev4 in db.Level4.Where(x => (x.Level3Id == lev3.Id)).DefaultIfEmpty()
  from lev5 in db.Level5.Where(x => (x.Level4Id == lev4.Id)).DefaultIfEmpty()
  from lev6 in db.Level6.Where(x => (x.Level5Id == lev5.Id)).DefaultIfEmpty()
  select new { Level1 = lev1, Level2 = lev2, Level3 = lev3, Level4 = lev4, Level5 = lev5, Level6 = lev6 }).AsQueryable();
我已经尝试过的第二种方法是联合查询结果,并为未使用的级别添加空值

查询如下所示:

 Table 1: Id , Name
 Table 2: Id , Table1Id, Name
 Table 3: Id , Table2Id, Name 
 ...
var databaseLevel =
    (from lev1 in db.Level1s select new { Level1 = lev1, Level2 = (Level2s)null, Level3 = (Level3s)null, Level4 = (Level4s)null, Level5 = (Level5s)null, Level6 = (Level6s)null })
    .Concat(from lev2 in db.Level2s select new { Level1 = lev2.Level1s, Level2 = lev2, Level3 = (Level3s)null, Level4 = (Level4s)null, Level5 = (Level5s)null, Level6 = (Level6s)null })
    .Concat(from lev3 in db.Level3s select new { Level1 = lev3.Level2s.Level1s, Level2 = lev3.Level2s, Level3 = lev3, Level4 = (Level4s)null, Level5 = (Level5s)null, Level6 = (Level6s)null })
    .Concat(from lev4 in db.Level4s select new { Level1 = lev4.Level3s.Level2s.Level1s, Level2 = lev4.Level3s.Level2s, Level3 = lev4.Level3s, Level4 = lev4, Level5 = (Level5s)null, Level6 = (Level6s)null })
    .Concat(from lev5 in db.Level5s select new { Level1 = lev5.Level4s.Level3s.Level2s.Level1s, Level2 = lev5.Level4s.Level3s.Level2s, Level3 = lev5.Level4s.Level3s, Level4 = lev5.Level4s, Level5 = lev5, Level6 = (Level6s)null })
    .Concat(from lev6 in db.Level6s select new { Level1 = lev6.Level5s.Level4s.Level3s.Level2s.Level1s, Level2 = lev6.Level5s.Level4s.Level3s.Level2s, Level3 = lev6.Level5s.Level4s.Level3s, Level4 = lev6.Level5s.Level4s, Level5 = lev6.Level5s, Level6 = lev6 })
     .AsQueryable(); 
此查询工作正常,但性能非常差。 现在我不知道如何创建我的查询


有人能给我一个提示吗

对于我创建的表(如果您提供数据插入,我会将其转换为您想要的内容,关键是with rollup和grouping函数):

生产出你想要的东西

您的加入必须是以下内容:

select * from 
table1 inner join table2 on [id]=table1id
 inner join table3 on table2id=table2.id

这很有效。非常感谢。但是,不能在Linq和实体框架中使用“rollup”命令