Как получить дополнительные XML-элементы с помощью синтаксиса LINQ lamda?
Это продолжение другого вопроса, который я задал здесь: https://www.codeproject.com/Answers/5162098/How-do-I-convert-this-LINQ-query-to-function-synta#answer1
Я генерирую XML, который мне нужен, используя следующий код:
bool includeDetails = true; XElement breakdown = new XElement ( "Breakdown", new XElement( "DetailsIncluded", includeDetails ), new XElement ( "Sections", estimateBreakdown.Sections.Select( x => new XElement ( "Section", new XAttribute( "SectionNumber", x.SectionNumber ), new XAttribute( "SectionName", x.SectionName ), x.CostItems.Select( c => new XElement ( "CostItem", new XElement( "Name", c.Name ), new XElement( "Units", c.Units.ToString() ), ( !includeDetails ) ? null : new XElement( "UnitCost", c.UnitCost.ToString() ) )) ) )) ); return breakdown.ToString();
Который генерирует следующий XML-код, когда
includeDetails
правдивый:<Breakdown> <DetailsIncluded>true</DetailsIncluded> <Sections> <Section SectionNumber="1" SectionName="Design"> <CostItem> <Name>Site Survey</Name> <Units>NotSpecified</Units> <UnitCost>0</UnitCost> </CostItem> <CostItem> <Name>Concept Design</Name> <Units>NotSpecified</Units> <UnitCost>0</UnitCost> </CostItem> </Section> </Sections> </Breakdown>
И следующий XML когда
includeDetails
ложный:<Breakdown> <DetailsIncluded>false</DetailsIncluded> <Sections> <Section SectionNumber="1" SectionName="Design"> <CostItem> <Name>Site Survey</Name> <Units>NotSpecified</Units> </CostItem> <CostItem> <Name>Concept Design</Name> <Units>NotSpecified</Units> </CostItem> </Section> </Sections> </Breakdown>
Пока все хорошо. Моя проблема в том, что, когда
includeDetails
это правда, мне действительно нужно добавить два XElement
объекты в XML. Это показывает, что я имею в виду, я думаю, однако это компилируется, но не действовать:( "CostItem", new XElement( "Name", c.Name ), new XElement( "Units", c.Units.ToString() ), ( includeDetails ) ? new XElement( "UnitCost", c.UnitCost.ToString() ) : null, ( includeDetails ) ? new XElement( "Quantity", c.Quantity.ToString() ) : null ))
Помимо очевидной неэффективности, что я тестирую флаг дважды, я ничего не получаю в своем XML, что, как я подозреваю, означает, что я получаю исключение в
XElement
конструктор.Кто-нибудь может показать мне, как это делается?
Что я уже пробовал:
Я предполагаю, что мне нужно сгенерировать
List<XElement>
содержащий два дополнительных узла, которые должны быть добавлены, когда includeDetails
это правда, а затем повторите ее, но я не могу понять синтаксис.
Richard Deeming
Для меня это прекрасно работает - хотя я был бы склонен удалить их ToString
звонит, потому что они не нужны.
Демонстрация[^]
Maciej Los
Звучит как ответ...
Patrick Skelton
Как все это странно! Теперь это работает и для меня. И я ни за что на свете не смогу воссоздать сломанную версию.
Вызовы ToString() удалены. Спасибо за подсказку!
Richard Deeming
Ага! Появляется дикое плавающая ошибка. :)