Я изучаю LINQ, и это кажется довольно простой проблемой. У меня есть полу-рабочий раствор, но я уверен, что его можно почистить.
Узел propertyAuto представляет автомобиль с id = 606.
Этот узел должен иметь как минимум два дочерних узла propertyValue, один из которых ссылается на элемент vehicleValuation с атрибутом «Book», а другой - «Auto». (Мой код еще не проверяет, они оба могут быть Авто или Забронировать сейчас)
Наконец, мне нужно получить балансовую стоимость и стоимость авто для той же машины.
Обратите внимание, что я никогда не узнаю ни ID, ни idRef заранее, и в будущем будет несколько машин.
Вот мой код (готов к копированию в LINQPad!)
var data = XElement.Parse (@"
<MyXML>
<propertyAuto id='606'>
<Values>
<propertyValue idRef='f95d5dce-8152-4e9e-889e-7433d32664d6' />
<propertyValue idRef='cd1a83a7-dd04-41f9-b31c-5408a38ac777' />
</Values>
</propertyAuto>
<Valuations>
<vehicleValuation id='cd1a83a7-dd04-41f9-b31c-5408a38ac777'
valuationType='Auto' estimatedValue='8350.00' />
<vehicleValuation id='f95d5dce-8152-4e9e-889e-7433d32664d6'
valuationType='Book' estimatedValue='12475.00' />
</Valuations>
</MyXML>");
var valuations = from property in data.Descendants("propertyValue")
join value in data.Descendants("vehicleValuation")
on
(string)property.Attribute("idRef")
equals
(string)value.Attribute("id")
where property.Parent.Descendants("propertyValue").Count() > 1
&& ((string)value.Attribute("valuationType") == "Auto" || (string)value.Attribute("valuationType") == "Book")
select new { Value = value.Attribute("estimatedValue").Value, Type = value.Attribute("valuationType").Value, PropertyID = property.Parent.Parent.Attribute("id").Value };
valuations.Dump();
var values = valuations.GroupBy(x=> x.PropertyID).FirstOrDefault();
string auto = values.Where(x => x.Type == "Auto").Select(x=>x.Value).First().ToString();
string book = values.Where(x => x.Type == "Book").Select(x=>x.Value).First().ToString();
auto.Dump();
book.Dump();
Это работоспособно или я должен перейти на xpath и т. Д.?