C# 基于级联表的SQL查询
首先,我使用Linq和实体框架来创建查询 我有6张桌子,它们以级联方式相互依赖。 因此,表中的数据布局如下所示: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
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”命令