使用Group Join在LINQ中连接多个数据表

时间:2015-11-30 13:46:23

标签: vb.net linq lambda .net-3.5

我在一个数据集中有五个数据表。现在我需要将它们加在一起。关键是,table1中的某些条目在其他表中没有条目。所以我需要一个左连接或左外连接。在SQL中它的工作原理如下:

SELECT *
FROM TABLE1 LDC 
LEFT JOIN TABLE2 LGDE ON LDC.KEY1 = LGDE.KEY2
LEFT JOIN TABLE3 DEFI ON  LGDE.KEY3 = DEFI.KEY 4
LEFT JOIN TABLE4 SETT ON DEFI.KEY5 = SETT.KEY6
LEFT JOIN TABLE5 LST ON SETT.KEY7 = LST.KEY8

现在我在VB.NET代码中使用LINQ重建了该语句。在我发现的其他一些帖子中,我必须使用DefaultIfEmpty()。但我无法让它发挥作用。所以这是我的代码。 (我们在.NET Framework 3.5上)

Dim result = From ldc In TABLE1
               Group Join lgde1 In TABLE2 On ldc.Field(Of String)("KEY1") Equals lgde1.Field(Of String)("KEY2") Into g = Group
             From lgde In g.DefaultIfEmpty()
               Group Join defi1 In TABLE3 On lgde.Field(Of Decimal?)("KEY3") Equals defi1.Field(Of Decimal?)("KEY4") Into g2 = Group
             From defi In g2.DefaultIfEmpty()
               Group Join sett1 In TABLE4 On defi.Field(Of Decimal?)("KEY5") Equals sett1.Field(Of Decimal?)("KEY6") Into g3 = Group
             From sett In g3.DefaultIfEmpty()
               Group Join lst1 In TABLE5 On sett.Field(Of Decimal?)("KEY7") Equals lst1.Field(Of Decimal?)("KEY8") Into g4 = Group
             From lst In g4.DefaultIfEmpty()

(选择部分有效,这就是我没有发布的原因)

我总是收到以下错误:

该值不能为NULL。 Parametername:第336行的System.Data.DataRowExensions.Field [T](Datarow,row,String columnName)中的行。

知道它为什么不起作用吗?

此致

2 个答案:

答案 0 :(得分:0)

当将它用于左外连接时,看起来您缺少DefaultIfEmpty()所需的其他信息。

请参阅this示例和this重复问题。

答案 1 :(得分:0)

我发现Group Join的效果比遵循语法

更差
Dim queryResult = _
    From t1 In Table1
    From t2 In Table2.Where(Function(r2) r2.Id = t1.Id).DefaultIfEmpty()
    From t3 In Table3.Where(Function(r3) r3.Id2 = t2.Id2).DefaultIfEmpty()
    . . . . 

但是,除非您选择t1(我们没有看到您的select部分),否则您可能需要在DefaultIfEmpty中提供一些内容

.DefaultIfEmpty(New MyObject() With { . . . . })

因为如果你没有,那么你就会遇到这个错误。这就是为什么你得到这个错误的答案。你得到它是因为你试图使用一个因左连接而不存在的值。当您检查列值是否为Null

时,这与数据库连接类似