As mentioned in the comments I would recommend you to move away from DataTable and use POCO classes to store your data and query those using LINQ. For your sample query you would have to declare these classes:
Public Class Customer
Public Property CustomerID As Integer
Public Property FirstName As String
Public Property LastName As String
Public Property Email As String
Public Property PhoneNumber As String
End Class
Public Class [Order]
Public Property OrderID As Integer
Public Property OrderDate As Date
Public Property Customer As Customer
End Class
I will skip the part where you parse the file and create the classes. I will assume you will keep them in a list. Then the LINQ query will be rather simple:
Dim queryResults = From o In orders Select o.Customer.FirstName, o.Customer.LastName, o.OrderID, o.OrderDate
Two things to note here. First Order contains a direct reference to Customer. You would need to resolve that when you load your entities. Second, the linq query produces a IEnumerable of an anonymous type. You can feed that to your UI for example, but you cannot return it from the containing method.
I appreciate this is different than you are used to. If you need further help on how to load the entities or how to process the queryResults I'm happy to update the answer.
Edit: How to store entities
Each entity in your model has an id. In this sample I assume it is an integer, but it could be anything - id doesn't really matter. To identify the id we introduce an interface and mark each entity with that:
Public Interface IEntityWithId
Property ID As Integer
End Interface
Public Class Customer
Implements IEntityWithId
Public Property CustomerID As Integer Implements IEntityWithId.ID
Public Property FirstName As String
Public Property LastName As String
Public Property Email As String
Public Property PhoneNumber As String
End Class
Public Class [Order]
Implements IEntityWithId
Public Property OrderID As Integer Implements IEntityWithId.ID
Public Property OrderDate As Date
Public Property Customer As Customer
End Class
Then we need a store for the entities, a repository. This will store the entities in a dictionary internally so the entities are easily accessible by id. We will group repositories for all entites in one class - a data context. This architecture is borrowed from Entity Framework.
Public Class Repository(Of TEntity As IEntityWithId)
Private entities As New Dictionary(Of Integer, TEntity)
Public Sub Add(entity As TEntity)
entities.Add(entity.ID, entity)
End Sub
Public Function GetById(id As Integer) As TEntity
Return entities(id)
End Function
Public ReadOnly Property All As IEnumerable(Of TEntity)
Get
Return entities.Values
End Get
End Property
End Class
Public Class DataContext
Public Property Customers As Repository(Of Customer)
Public Property Orders As Repository(Of [Order])
Public Sub New()
Customers = New Repository(Of Customer)
Orders = New Repository(Of [Order])
End Sub
End Class
When you parse the input, you create a new entity and add it to the data context. First you need to read customers, only then orders? Remember the Customer reference in Order class? When loading orders you need to have customers already loaded so you can resolve the objects by id. The above code will make it a lot easier:
Dim ctx As New DataContext
ctx.Customers.Add(New Customer With { .CustomerID = 1, .FirstName = "Paul", .LastName = "Newman" })
ctx.Orders.Add(New [Order] With { .OrderID = 1000, .OrderDate= #11/21/2014#, .Customer = ctx.Customers.GetById(1) })
ctx.Orders.Add(New [Order] With { .OrderID = 2000, .OrderDate= #11/24/2014#, .Customer = ctx.Customers.GetById(1) })
Dim queryResults = From o In ctx.Orders.All Select o.Customer.FirstName, o.Customer.LastName, o.OrderID, o.OrderDate