是否可以构建动态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
答案 0 :(得分:1)
作弊(一点):如果您有inner join
,则将条件放在联接的On
部分或Where
上是等效的,并且如果您有多个条件在And
中的Where
中,将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