动态连接子句 linq
Dynamic join clause linq
是否可以构建动态 linq 查询。我的问题是连接条件可能是一对多的。加入的字段数会根据不同的场景而变化。
dim data = (From drow As DataRow In dtDistinctRecords.Rows
Join mainSourceRow As DataRow In mainSource.Rows
On drow.Field(Of String)(var0) Equals mainSourceRow.Field(Of String)(var0)
And drow.Field(Of String)(var1) Equals mainSourceRow.Field(Of String)(var1)
And drow.Field(Of String)(var2) Equals mainSourceRow.Field(Of String)(var2)
And drow.Field(Of String)(var3) Equals mainSourceRow.Field(Of String)(var3)
上述问题的解决方案如下:
这段代码适用于设置选项推断(在项目 属性 上可用),但不能关闭。我有一个遗留应用程序,它启用了这个选项。 仍然无法在选项推断设置为关闭的情况下工作。
Private Sub SurroundingSub()
Dim columnNames As String() = {"MyColumn1", "MyColumn2"}
Dim dt As DataTable = New DataTable()
dt.Columns.Add("MyColumn", GetType(String))
dt.Columns.Add("MyColumn1", GetType(String))
dt.Columns.Add("MyColumn2", GetType(String))
dt.Columns.Add("Data", GetType(String))
For i As Integer = 0 To 10 - 1
Dim dr As DataRow = dt.NewRow()
dr("MyColumn") = "MyColumn" & i
dr("MyColumn1") = "MyColumn1" & i
dr("MyColumn2") = "MyColumn2" & i
dr("Data") = "Data1" & i
dt.Rows.Add(dr)
Next
Dim dt1 As DataTable = New DataTable()
dt1.Columns.Add("MyColumn", GetType(String))
dt1.Columns.Add("MyColumn1", GetType(String))
dt1.Columns.Add("MyColumn2", GetType(String))
dt1.Columns.Add("Data", GetType(String))
For i As Integer = 0 To 5 - 1
Dim dr As DataRow = dt1.NewRow()
dr("MyColumn") = "MyColumn" & i
dr("MyColumn1") = "MyColumn1" & (i)
dr("MyColumn2") = "MyColumn2" & (i)
dr("Data") = "Data2" & i
dt1.Rows.Add(dr)
Next
dt1.Rows(0)("MyColumn1") = "MyColumn111"
dt1.Rows(1)("MyColumn2") = "MyColumn888"
Dim data = (From dr In dt.AsEnumerable() Join dr1 In dt1.AsEnumerable() On dr("MyColumn") Equals dr1("MyColumn") Select New With {.Dr = dr, .Dr1 = dr1
})
**'It fails here**
For Each column As String In columnNames
Dim columnname = column
data = data.Where(Function(x) x.dr.Field(Of String)(columnname) =
x.dr1.Field(Of String)(columnname))
Next
Dim value = data.[Select](Function(x) x.dr1).CopyToDataTable()
End Sub
欺骗(一点点):如果你有一个inner join
,把条件放在连接的On
部分或Where
中是等价的,如果你有一个Where
中And
中的多个条件,拆分多个Where
中的Where是等价的。
所以你可以:
Dim data = From drow as DataRow In dtDistinctRecords.Rows
From mainSourceRow In mainSource.Rows
Select New With { drow, mainSourceRow }
If cond1 Then
data = data.Where(Function(x) x.drow.Field(Of String)("var0") = x.mainSourceRow.Field(Of String)("var0"))
End If
If cond2 Then
data = data.Where(Function(x) x.drow.Field(Of String)("var1") = x.mainSourceRow.Field(Of String)("var1"))
End If
是否可以构建动态 linq 查询。我的问题是连接条件可能是一对多的。加入的字段数会根据不同的场景而变化。
dim data = (From drow As DataRow In dtDistinctRecords.Rows
Join mainSourceRow As DataRow In mainSource.Rows
On drow.Field(Of String)(var0) Equals mainSourceRow.Field(Of String)(var0)
And drow.Field(Of String)(var1) Equals mainSourceRow.Field(Of String)(var1)
And drow.Field(Of String)(var2) Equals mainSourceRow.Field(Of String)(var2)
And drow.Field(Of String)(var3) Equals mainSourceRow.Field(Of String)(var3)
上述问题的解决方案如下: 这段代码适用于设置选项推断(在项目 属性 上可用),但不能关闭。我有一个遗留应用程序,它启用了这个选项。 仍然无法在选项推断设置为关闭的情况下工作。
Private Sub SurroundingSub()
Dim columnNames As String() = {"MyColumn1", "MyColumn2"}
Dim dt As DataTable = New DataTable()
dt.Columns.Add("MyColumn", GetType(String))
dt.Columns.Add("MyColumn1", GetType(String))
dt.Columns.Add("MyColumn2", GetType(String))
dt.Columns.Add("Data", GetType(String))
For i As Integer = 0 To 10 - 1
Dim dr As DataRow = dt.NewRow()
dr("MyColumn") = "MyColumn" & i
dr("MyColumn1") = "MyColumn1" & i
dr("MyColumn2") = "MyColumn2" & i
dr("Data") = "Data1" & i
dt.Rows.Add(dr)
Next
Dim dt1 As DataTable = New DataTable()
dt1.Columns.Add("MyColumn", GetType(String))
dt1.Columns.Add("MyColumn1", GetType(String))
dt1.Columns.Add("MyColumn2", GetType(String))
dt1.Columns.Add("Data", GetType(String))
For i As Integer = 0 To 5 - 1
Dim dr As DataRow = dt1.NewRow()
dr("MyColumn") = "MyColumn" & i
dr("MyColumn1") = "MyColumn1" & (i)
dr("MyColumn2") = "MyColumn2" & (i)
dr("Data") = "Data2" & i
dt1.Rows.Add(dr)
Next
dt1.Rows(0)("MyColumn1") = "MyColumn111"
dt1.Rows(1)("MyColumn2") = "MyColumn888"
Dim data = (From dr In dt.AsEnumerable() Join dr1 In dt1.AsEnumerable() On dr("MyColumn") Equals dr1("MyColumn") Select New With {.Dr = dr, .Dr1 = dr1
})
**'It fails here**
For Each column As String In columnNames
Dim columnname = column
data = data.Where(Function(x) x.dr.Field(Of String)(columnname) =
x.dr1.Field(Of String)(columnname))
Next
Dim value = data.[Select](Function(x) x.dr1).CopyToDataTable()
End Sub
欺骗(一点点):如果你有一个inner join
,把条件放在连接的On
部分或Where
中是等价的,如果你有一个Where
中And
中的多个条件,拆分多个Where
中的Where是等价的。
所以你可以:
Dim data = From drow as DataRow In dtDistinctRecords.Rows
From mainSourceRow In mainSource.Rows
Select New With { drow, mainSourceRow }
If cond1 Then
data = data.Where(Function(x) x.drow.Field(Of String)("var0") = x.mainSourceRow.Field(Of String)("var0"))
End If
If cond2 Then
data = data.Where(Function(x) x.drow.Field(Of String)("var1") = x.mainSourceRow.Field(Of String)("var1"))
End If