使用 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();
我很确定这里某处有这样的示例,但我找不到它,因为我不知道确切的术语。所以,请善待。
问题应该很简单:
我有一个 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();