2009-11-05 2 views
1

Мне было интересно, как я могу выбрать несколько инициализаторов объектов в 1 select statement, используя XML-документ. Я хотел бы избежать нескольких итераций в одном файле.Инициализаторы многоуровневых объектов в 1 запросе LINQ

Структура XML выглядит следующим образом:

<root> 
    <doc name="test.doc"> 
    <version lang="nl"> 
    </version> 
    <version lang="fr"> 
    </version> 
    </doc> 
    <doc name="test2.doc"> 
    <version lang="nl"> 
     <title>Document over ons</title> 
    </version> 
    <version lang="fr"> 
     <title>Document de nous</title> 
    </version> 
    </doc> 
</root> 

Оператор LINQ для 1 элемента будет выглядеть следующим образом:

var docs = select e from xmlDoc.Descendants("doc") 
      select new docEntry() 
      { 
      Name = (string)e.Attribute("name"), 
      Title = (string)element.Elements("version").Where(d => (string)d.Attribute("language_code") == "nl").First().Element("title") 
      } 

Теперь я хотел бы, чтобы выбрать французский вариант в 1 идти, а , псевдо-код примерно так:

var docs = select e from xmlDoc.Descendants("doc") 
      select new docEntry() 
      { 
      Name = (string)e.Attribute("name"), 
      Title = (string)element.Elements("version").Where(d => (string)d.Attribute("language_code") == "nl").First().Element("title") 
      }, 
      select new docEntry() 
      { 
      Name = (string)e.Attribute("name"), 
      Title = (string)element.Elements("version").Where(d => (string)d.Attribute("language_code") == "fr").First().Element("title") 
      } 

Любые идеи о том, как я могу это сделать в 1 раз? Я знаю, что смогу сделать это в 2-х раундах по XML, но это было бы глупо, нет?

ответ

4
var docs = from e in xmlDoc.Descendants("doc") 
      select new 
      { 
       NL = new docEntry 
       { 
       Name = e.Attribute("name").Value, 
       Title = e.Elements("version").Where(d => d.Attribute("language_code").Value == "nl").First().Element("title").Value 
       }, 
       FR = new docEntry 
       { 
       Name = e.Attribute("name").Value, 
       Title = e.Elements("version").Where(d => d.Attribute("language_code").Value == "fr").First().Element("title").Value 
       } 
      }; 

Другой, немного другой вариант:

var docs = from e in from xmlDoc.Descendants("doc") 
      select new[] 
      { 
       new docEntry 
       { 
       Name = e.Attribute("name").Value, 
       Title = e.Elements("version").Where(d => d.Attribute("language_code").Value == "nl").First().Element("title").Value 
       }, 
       new docEntry 
       { 
       Name = e.Attribute("name").Value, 
       Title = e.Elements("version").Where(d => d.Attribute("language_code").Value == "fr").First().Element("title").Value 
       } 
      }; 
+0

Оу да, это синтаксис я искал –

Смежные вопросы