Хорошо, довольно много, чтобы покрыть. Во-первых, ваш предметный тег для этого вопроса был "Linq-to-sql", а не "linq-to-xml", поэтому я исправил это.
Второй вопрос - находится ли под вашим контролем формат XML? Если это так, то вы можете рассмотреть возможность переписать его так, чтобы структура данных соответствовала структуре ваших классов. Это означает, что вы можете сериализовать XML прямо в ваши классы. Это облегчает чтение. Например, ваш XML мог бы быть более читабельным, если бы он выглядел так:
Dim better = <TripSheet>
<PatientCareNumber>9-542</PatientCareNumber>
<!-- other fields -->
<MileageOut>123</MileageOut>
<MileageAtScene>321</MileageAtScene>
<MileageAtDestination>456</MileageAtDestination>
<IncidentCrew>
<Crew CrewID="1234"/>
<Crew CrewID="5678"/>
<Crew CrewID="9876"/>
</IncidentCrew>
</TripSheet>
Я предполагаю, что этот формат был навязан вам, и вы не можете его изменить. В этом случае ключевой проблемой здесь является .Descendants () - это говорит LINQ to XML, что нужно пройтись по всем узлам XML и найти ЛЮБЫХ потомков с именем, которое вы дали, которое существует ниже вызываемого узла. Вы вызываете это на узле записи, чтобы он нашел их все.
Я бы порекомендовал Отличный доклад Майка Таулти о LINQ to XML
Вместо этого вам нужно использовать .Element () или .Elements (), который смотрит только на первый уровень. Я исправил код здесь:
Sub Main()
Dim xml = <Record>
<E01>
<E01_01>9-542</E01_01>
<E01_02>Ortivus</E01_02>
<E01_03>Sweet-Billing & Field Data</E01_03>
<E01_04>5.6.020120130</E01_04>
</E01>
<E02>
<E02_01>123</E02_01>
<E02_02>-20</E02_02>
<E02_03>F12006149</E02_03>
<E02_04>30</E02_04>
<E02_05>75</E02_05>
<E02_06>105</E02_06>
<E02_07>150</E02_07>
<E02_08>225</E02_08>
<E02_09>290</E02_09>
<E02_10>360</E02_10>
<E02_11>-20</E02_11>
<E02_12>447</E02_12>
<E02_13>-20</E02_13>
<E02_14>-20</E02_14>
<E02_17>2.3</E02_17>
<E02_18>3</E02_18>
<E02_19>3.7</E02_19>
</E02>
<E03>
<E03_01>445</E03_01>
<E03_02>-20</E03_02>
<E03_03>-25</E03_03>
</E03>
<E04>
<E04_01>155306</E04_01>
<E04_02>580</E04_02>
<E04_03>6120</E04_03>
</E04>
<E04>
<E04_01>032519</E04_01>
<E04_02>585</E04_02>
<E04_03>6090</E04_03>
</E04>
<E04>
<E04_01>083589</E04_01>
<E04_02>590</E04_02>
<E04_03>6090</E04_03>
</E04>
</Record>
Dim doc As New XDocument(xml)
'Dim ns As XNamespace = doc.Root.Name.[Namespace]
'get each record
Dim TripSheets = (From record In doc.Elements("Record") _
Let e01 = record.Element("E01") _
Let e02 = record.Element("E02") _
Let e04s = record.Elements("E04") _
Select New TripSheet With _
{ _
.PatientCareNumber = e01.Element("E01_01"), _
.IncidentCrew = (From e04 In e04s _
Select New Crew() With {.CrewID = e04.Element("E04_01")}).ToArray(), _
.MileageOut = e02.Element("E02_16"), _
.MileageAtScene = e02.Element("E02_17"), _
.MileageAtDestination = e02.Element("E02_18"), _
.MileageInQuarters = e02.Element("E02_19") _
}).ToList()
For Each trip In TripSheets
Console.WriteLine("{0} -> {1} crew", trip.PatientCareNumber, trip.IncidentCrew.Count)
Next
Console.ReadKey()
End Sub
End Module