Well, I see your point, and this is actually by design. You are wanting to perform a query, and then the internal ADO.NET table to automatically have all of the columns for the table. This is not how the logic of a BO works. It expects those columns to be included within the query or to be defined. In our medical software, we actually have a shared method that ensures that columns and their default values exist in the case that we attempt to reference it, etc. It looks something like this:
''' <summary>
''' Ensures that the column specified exists within the table.
''' </summary>
''' <param name="table"></param>
''' <param name="columnName"></param>
''' <param name="columnType"></param>
''' <param name="defaultValue"></param>
''' <remarks></remarks>
Public Shared Sub EnsureColumnExists(ByVal table As DataTable, ByVal columnName As String, ByVal columnType As System.Type, ByVal defaultValue As Object)
'-- Establish Locals
Dim col As DataColumn
Dim columnFound As Boolean = False
'-- Cycle through all of the columns so we can test on a case-insensitive basis
For Each col In table.Columns
'-- Check to see if the column name matches
columnFound = col.ColumnName.Equals(columnName, StringComparison.OrdinalIgnoreCase)
'-- If the column was found, exit
If columnFound Then Exit For
Next
'-- See if there is any reason to continue
If columnFound Then Exit Sub
'-- If we make it to this point, then we have a hit
col = New DataColumn(columnName, columnType)
col.DefaultValue = defaultValue
'-- Add the column to the table
table.Columns.Add(col)
End Sub