Группировка рекурсивных дочерних элементов на основе значения свойства - PullRequest
0 голосов
/ 26 апреля 2011

Вот мой пример XML.Как я могу сгруппировать эти Department элементы, используя LINQ to XML, где у каждого есть атрибут hasLab='1'?

   <ResearchLabs>
  <Departments>
    <Department  hasLab="1">
      <Department hasLab="0">
        <Subject name="Pharma"/>
        <Department hasLab="1">
          <Department hasLab="0">
            <Subject name="Data"/>
          </Department>
        </Department>
      </Department>
      <Department hasLab="0">
        <Subject name="Submission"/>
      </Department>
    </Department>
  </Departments>
</ResearchLabs>

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Это то, что вы искали?

Это группирует все дочерние отделы, у которых нет лаборатории, под родительскими отделами, где есть лаборатория.

var query = from dept in doc.Descendants("Department")
            where (int)dept.Attribute("hasLab") == 0
               && dept.Parent.Name == "Department" // probably not needed
               && (int)dept.Parent.Attribute("hasLab") == 1
            group dept by dept.Parent;

Или альтернативазапрос, вероятно, более эффективный:

var query = from dept in doc.Descendants("Department")
            where (int)dept.Attribute("hasLab") == 1
            from sub in dept.Elements("Department")
            where (int)sub.Attribute("hasLab") == 0
            group sub by dept;

Хотя я бы предпочел не создавать группировку (определенно более эффективную):

var query = from dept in doc.Descendants("Department")
            where (int)dept.Attribute("hasLab") == 1
            select new
            {
                Parent   = dept,
                Children = dept.Elements("Department")
                               .Where(sub => (int)sub.Attribute("hasLab") == 0),
            };
2 голосов
/ 26 апреля 2011

Не совсем точно, что вы пытаетесь сделать, но вы можете использовать:

var grouped = xml.Descendants("Department")
                 .GroupBy(x => (int) x.Attribute("hasLab"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...