左连接时linqpad错误

时间:2013-08-14 14:38:37

标签: vb.net linq-to-sql linqpad

有很多关于如何在Linq中进行准左连接的示例(thisthis,甚至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失去了理智?

1 个答案:

答案 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