小编典典

使用LINQ to Entities编写嵌套联接

sql

我很确定这里有个示例,因为我不知道确切的用语,所以我找不到它。所以,请客气。

这个问题应该是一个简单的问题:

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

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

我具有实体A的ID,并希望尽可能最佳地返回所有连接的实体直至Ds的树。

开始:

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

现在,我需要对B中的每个B进行C转换,然后对C再次对D进行此转换。如果我按照ob脚的方式,先将Ds和Cs结合在一起,然后将Bs和Cs结合在一起,最后将As和Bs结合起来,这意味着将所有D与C结合起来,然后将所有……结合起来,直到我终于到达IDParameter过滤器为止。这似乎无效。

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


阅读 169

收藏
2021-04-14

共1个答案

小编典典

您可以使用手动联接模拟定义关系后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();
2021-04-14