使用 Group Join 在 LINQ 中加入多个数据表
Join Multiple Datatables in LINQ using Group Join
我在一个数据集中有五个数据表。现在我需要把他们都加入进来。关键是,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 重建了该语句。在我发现的其他一些 post 中,我必须使用 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()
(Select 部分有效,这就是为什么我没有 post 它)
我总是收到以下错误:
该值不能为 NULL。 Parametername: row in System.Data.DataRowExensions.Field[T](Datarow, row, String columnName) on Line 336.
知道为什么它不起作用吗?
此致
在将 DefaultIfEmpty() 用于左外连接时,您似乎缺少所需的附加信息。
请参阅 this example, and this 个重复问题。
我发现 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()
. . . .
但是,除非您 select t1
(我们没有看到您的 select
部分),否则您可能需要在 DefaultIfEmpty
.DefaultIfEmpty(New MyObject() With { . . . . })
因为如果你不这样做,你就会遇到这个错误。这就是 为什么 您收到此错误的答案。你得到它是因为你试图使用一个不存在的值作为左连接的结果。这类似于数据库连接,当您检查列值是否为 Null
时
我在一个数据集中有五个数据表。现在我需要把他们都加入进来。关键是,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 重建了该语句。在我发现的其他一些 post 中,我必须使用 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()
(Select 部分有效,这就是为什么我没有 post 它)
我总是收到以下错误:
该值不能为 NULL。 Parametername: row in System.Data.DataRowExensions.Field[T](Datarow, row, String columnName) on Line 336.
知道为什么它不起作用吗?
此致
在将 DefaultIfEmpty() 用于左外连接时,您似乎缺少所需的附加信息。
请参阅 this example, and this 个重复问题。
我发现 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()
. . . .
但是,除非您 select t1
(我们没有看到您的 select
部分),否则您可能需要在 DefaultIfEmpty
.DefaultIfEmpty(New MyObject() With { . . . . })
因为如果你不这样做,你就会遇到这个错误。这就是 为什么 您收到此错误的答案。你得到它是因为你试图使用一个不存在的值作为左连接的结果。这类似于数据库连接,当您检查列值是否为 Null