У меня есть xml-документ с основными «подробностями» XElement и несколькими «подробными» XElements, и для каждого подробного элемента у меня также есть несколько элементов «node», это часть моего XML-документа:
<details>
<detail>
<node>
<key>HEADER ID</key>
<value>D10</value>
</node>
<node>
<key>PRODUCT NO</key>
<value>9671834480D04 </value>
</node>
<node>
<key>WIRE (CODE)</key>
<value>AD8</value>
</node>
<node>
<key>WIRE SIZE(CODE)</key>
<value>047</value>
</node>
<node>
<key>WIRE COLOR(CODE)</key>
<value>30</value>
</node>
<node>
<key>CUT LENGTH</key>
<value>01910</value>
</node>
</detail>
<detail>
<node>
...
</node>
...
</detail>
...
<details>
Я пытаюсь преобразовать эту xml-часть в список объектов, который содержит только 3 свойства, соответствующие элементам «Key» и «value». например, для каждого элемента детали в деталях и для каждого элемента узла в деталях я хочу получить только 3 узла, где ключевой элемент равен «НОМЕР ПРОДУКТА» или «ВИД ПРОВОДА (КОД)» или «ДЛИНА РЕЗКИ»?
это мой код, он работает, но я думаю, что он не подходит для производительности:
var champs =
from detail in details
let productNo = detail.Elements("node")
.Where(k => k.Element("key")
.Value == "PRODUCT NO")
.Select(v => v.Element("value").Value)
.First()
let wireCode = detail.Elements("node")
.Where(k => k.Element("key").Value == "WIRE (CODE)")
.Select(v => v.Element("value").Value)
.First()
let cutLength = detail.Elements("node")
.Where(k => k.Element("key").Value == "CUT LENGTH")
.Select(v => v.Element("value").Value)
.First()
select new { ProductNo = productNo, WireCode = wireCode , CutLength = cutLength };
я думаю, что это пример проблемы выбора n + 1, потому что для каждого свойства я должен просматривать все узлы, как я могу сделать то же самое с одним циклом?