1

这里有很多关于如何在 Linq 中进行准左连接的示例(this,also 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 疯了?

4

1 回答 1

1

与 C# 不同,VB.NET 期望子句与关键字Group Join一起执行左外连接。Group查看MSDN 文档,特别是“使用组连接子句执行左外连接”部分。

尝试以下查询:

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
于 2013-08-14T15:08:52.317 回答