Firstly thank you for providing a sample set of code for us to use. It speeds things up.
If I understand your question correctly you want to get the adults who are traveling along with the city(s) and age(s).
var adultsWithTravel = from adult in adultList
join travel in travelList on adult.Name equals travel.Worklist?.Name
select new { Adult = adult, City = travel.CityName, Age = travel.Worklist.Age };
For your sample set it would return back 1 entry as only Mary is in the list of adults. However if we were to add John to the list of adults we'd get back 3 entries (1 for Mary and 2 for John). I'm ignoring the fact here that John is probably 2 different people given that the ages are different. But you most likely want each adult with their travel grouped together so we can adjust the query to handle that instead by grouping on the worklist name (and optionally age) first.
var adultsWithTravel = from travel in travelList
group travel by travel.Worklist?.Name into g
join adult in adultList on g.Key equals adult.Name
select new { Adult = adult, Travel = g.ToArray() };
Now you get back 2 results, 1 for Mary and 1 for John. Each result has a Travel
property that is an array of the place(s) they want to travel. To me this is the easiest approach but if you really just want the city and age then you can adjust the g.ToArray()
to instead select just the subset of data.
var adultsWithTravel = from travel in travelList
group travel by travel.Worklist?.Name into g
join adult in adultList on g.Key equals adult.Name
select new { Adult = adult, Travel = g.Select(x => new { City = x.CityName, Age = x.Worklist.Age }).ToArray() };