有很多关于如何在Linq中进行准左连接的示例(this,this,甚至this)。它们都指向将少数父表连接到“外部”表中,然后使用DefaultIfEmpty()
从该表中进行选择。听起来很容易,所以我在LinqPad中创建了这个片段:
dim foo = (
from c in context.Contacts
join p in context.Plants on c.PlantID equals p.PlantID into outer
from o in outer.DefaultIfEmpty()
where p.PlantCode = 2
select c.ContactName, p.PlantName
)
等效的SQL语句是:
SELECT c.ContactName, p.PlantName
FROM Contacts c
LEFT JOIN Plants p ON c.PlantID = p.PlantID
WHERE p.PlantCode = 2
看起来它应该可以正常工作,但是LinqPad一直停在join...into
行,并出现此错误:')' expected.
我做错了吗?或者LinqPad失去了理智?
答案 0 :(得分:1)
与C#不同,VB.NET期望Group Join
子句执行左外连接以及Group
关键字。查看MSDN documentation,特别是“使用组加入条款执行左外连接”部分。
尝试以下查询:
From c In context.Contacts
Group Join p In context.Plants On c.PlantID Equals p.PlantID Into outer = Group
From o In outer.DefaultIfEmpty()
Where o.PlantCode = 2
Select c.ContactName, p.PlantName
编辑:您应该使用o.PlantCode
而不是p.PlantCode
,因为查询分组时p
变量不在范围内。
请注意使用outer = Group
,这是对分组进行别名的方法。或者,如果您不关心别名,可以直接针对Group
编写查询:
From c In context.Contacts
Group Join p In context.Plants On c.PlantID Equals p.PlantID Into Group
From o In Group.DefaultIfEmpty()
Where o.PlantCode = 2
Select c.ContactName, p.PlantName