Linq to Entities 循环左外连接
Linq to Entities cycling left outer joins
我对 Linq to entities 有以下问题。
示意图:
Linq to entities 查询(尚未完成):
from a in Anlaesse
join b in Beurteilung on a.AnlassID equals b.AnlassID into ab
from b in ab.DefaultIfEmpty()
join r in Rangliste on a.AnlassID equals r.AnlassId
join p in Pony on r.PonyId equals p.PonyID into rp
from p in rp.DefaultIfEmpty()
where a.AnlassID == 67
select new
{
BeurteilungId = b.BeurteilungID == null ? 0 : b.BeurteilungID,
PonyID = p.PonyID == null ? 0 : p.PonyID,
Name = p.Name,
PonyName1 = r.PonyName1,
AnlassId = a.AnlassID == null ? 0 : a.AnlassID
}
生成SQL:
SELECT
[Extent1].[AnlassID] AS [AnlassID],
CASE WHEN ([Extent2].[BeurteilungID] IS NULL) THEN 0 ELSE
[Extent2].[BeurteilungID] END AS [C1],
CASE WHEN ([Extent4].[PonyID] IS NULL) THEN 0 ELSE [Extent4].[PonyID] END
AS [C2],
[Extent4].[Name] AS [Name],
[Extent3].[PonyName1] AS [PonyName1]
FROM [sspv].[Anlaesse] AS [Extent1]
LEFT OUTER JOIN [sspv].[Beurteilung] AS [Extent2] ON [Extent1].[AnlassID]
= [Extent2].[AnlassID]
INNER JOIN [sspv].[Rangliste] AS [Extent3] ON [Extent1].[AnlassID] =
[Extent3].[AnlassId]
LEFT OUTER JOIN [sspv].[Pony] AS [Extent4] ON [Extent3].[PonyId] =
[Extent4].[PonyID]
WHERE 67 = [Extent1].[AnlassID]
问题是我无法在 Pony 和 Beurteilung 之间添加左外连接,因为所有表都已经 "used" 在我的查询中。没有这个结果是错误的,因为它 Returns 每个 Pony all Beurteilung.
假设您要左联 Pony
到 Beurteilung
。假设两者都有 PonyId
属性。像这样的子句将充当内部连接:
where p.PonyId == b.PonyId
像这样的子句将充当左连接。
where b == null || p.PonyId == b.PonyId
但是,您发现这很难,因为看起来您确实没有正确使用 Entity Framework。您是否映射了任何导航属性或集合?如果您还没有添加它们,因为这是 EF 的重点。如果你有那么你就不需要使用内部或左连接;你只是遍历导航属性。
我对 Linq to entities 有以下问题。
示意图:
Linq to entities 查询(尚未完成):
from a in Anlaesse
join b in Beurteilung on a.AnlassID equals b.AnlassID into ab
from b in ab.DefaultIfEmpty()
join r in Rangliste on a.AnlassID equals r.AnlassId
join p in Pony on r.PonyId equals p.PonyID into rp
from p in rp.DefaultIfEmpty()
where a.AnlassID == 67
select new
{
BeurteilungId = b.BeurteilungID == null ? 0 : b.BeurteilungID,
PonyID = p.PonyID == null ? 0 : p.PonyID,
Name = p.Name,
PonyName1 = r.PonyName1,
AnlassId = a.AnlassID == null ? 0 : a.AnlassID
}
生成SQL:
SELECT
[Extent1].[AnlassID] AS [AnlassID],
CASE WHEN ([Extent2].[BeurteilungID] IS NULL) THEN 0 ELSE
[Extent2].[BeurteilungID] END AS [C1],
CASE WHEN ([Extent4].[PonyID] IS NULL) THEN 0 ELSE [Extent4].[PonyID] END
AS [C2],
[Extent4].[Name] AS [Name],
[Extent3].[PonyName1] AS [PonyName1]
FROM [sspv].[Anlaesse] AS [Extent1]
LEFT OUTER JOIN [sspv].[Beurteilung] AS [Extent2] ON [Extent1].[AnlassID]
= [Extent2].[AnlassID]
INNER JOIN [sspv].[Rangliste] AS [Extent3] ON [Extent1].[AnlassID] =
[Extent3].[AnlassId]
LEFT OUTER JOIN [sspv].[Pony] AS [Extent4] ON [Extent3].[PonyId] =
[Extent4].[PonyID]
WHERE 67 = [Extent1].[AnlassID]
问题是我无法在 Pony 和 Beurteilung 之间添加左外连接,因为所有表都已经 "used" 在我的查询中。没有这个结果是错误的,因为它 Returns 每个 Pony all Beurteilung.
假设您要左联 Pony
到 Beurteilung
。假设两者都有 PonyId
属性。像这样的子句将充当内部连接:
where p.PonyId == b.PonyId
像这样的子句将充当左连接。
where b == null || p.PonyId == b.PonyId
但是,您发现这很难,因为看起来您确实没有正确使用 Entity Framework。您是否映射了任何导航属性或集合?如果您还没有添加它们,因为这是 EF 的重点。如果你有那么你就不需要使用内部或左连接;你只是遍历导航属性。