Hi @Mansour_Dalir ,
You can use the following code to query a DataTable with a dynamic number of columns.
Private Function FilterByChildTable(DynamicColumn As DataTable, StaticColumn As DataTable, Optional WithSort As Boolean = False) As DataTable
Dim dynamicColumnNames = DynamicColumn.Columns.Cast(Of DataColumn)().Skip(1).Select(Function(col) col.ColumnName).ToArray()
Dim query = DynamicColumn.AsEnumerable() _
.Join(StaticColumn.AsEnumerable(),
Function(parentRow) parentRow("parentId").ToString(),
Function(childRow) childRow("chidId").ToString(),
Function(parentRow, childRow) New With {
.Filter = parentRow("parentId"), ' Static Column
.DynamicData = dynamicColumnNames.Select(Function(colName) parentRow(colName)).ToArray() ' Dynamic Columns
}) _
.OrderBy(Function(row) row.Filter)
Dim resultTable As New DataTable("Result") ' Dynamic
resultTable.Columns.Add("parentId") ' Static Column
For Each colName In dynamicColumnNames
resultTable.Columns.Add(colName) ' Dynamic Columns
Next
Dim dtResult As DataTable = resultTable.Clone() ' Create a clone of resultTable
For Each row In query
Dim newRow = dtResult.NewRow()
newRow("parentId") = row.Filter
For i As Integer = 0 To dynamicColumnNames.Length - 1
newRow(i + 1) = row.DynamicData(i)
Next
dtResult.Rows.Add(newRow)
Next
If WithSort Then
dtResult.DefaultView.Sort = "parentId ASC" ' Sort dtResult by parentId column in ascending order
dtResult = dtResult.DefaultView.ToTable()
End If
Return dtResult
End Function
Best Regards.
Jiachen Li
If the answer is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.