使用 LINQ to Entities 编写嵌套连接

Writing a nested join with LINQ to Entities

我很确定这里某处有这样的示例,但我找不到它,因为我不知道确切的术语。所以,请善待。

问题应该很简单:

我有一个 Azure SQL 数据库,设计有些糟糕(即缺少外键等)。由于此时我无法重新设计数据库,因此我必须通过查询手动处理关系。由于数据库也是我们软件的瓶颈,我必须尝试以尽可能少的数据库命中来完成查询。

我有实体 A、B、C 和 D。实体 A 有多个实体 B(与未注册的外键连接),实体 B 有多个实体 C,实体 C 有多个实体 D。

我有实体 A 的 ID,并希望 return 尽可能优化所有连接实体的树,直到 Ds。

开始:

from A in dbA.Where(e=>e.Id==IDParameter)
join B in dbB on A.Id equals B.AId into Bs

现在我需要为 C 对 Bs 中的每个 B 执行此操作,并为 D 再次对 Cs 执行此操作。如果我采用显而易见的方式,首先加入 Ds 和 Cs,然后加入 Bs 和 Cs,最后加入As 和 Bs,这意味着将所有 Ds 与 Cs 连接起来,然后所有......你明白了,直到我最终到达 IDParameter 过滤器。只是好像没什么效果。

是否有适当的 C# 方法在单个查询中执行此操作?

您可以使用手动连接来模拟 EF 在您定义了关系时执行的操作。您所需要的只是使用 Group Join 和投影。像这样:

var result =
    (from a in db.A
     where a.Id == IDParameter
     join b in db.B on a.Id equals b.AId into Bs
     select new
     {
         a,
         Bs =
            (from b in Bs
             join c in db.C on b.Id equals c.BId into Cs
             select new
             {
                 b,
                 Cs =
                    (from c in Cs
                     join d in db.D on c.Id equals d.CId into Ds
                     select new
                     {
                         c,
                         Ds = Ds.ToList()
                     }).ToList() 
             }).ToList()
     }).ToList();