Как заполнить родительскую дочернюю структуру данных из XML, где общие объекты List <> находятся в родительской и дочерней структурах, используя один запрос LINQ? - PullRequest
0 голосов
/ 15 июня 2009

У меня есть файл конфигурации XML, который содержит список документов с картами полей для каждого документа. Я хочу использовать LINQ to XML для заполнения внутренней структуры данных, которая представляет документы в виде иерархии структур List <>.

Атрибут «Включить» определяет, следует ли включать поле.

Вот пример того, как выглядит XML:

<Documents>
  <Document Include="1" DocumentName="Report1" >
    <Field Include="1" OldName="Old1" NewName="New1"/>
    <Field Include="1" OldName="Old2" NewName="New2"/>
    <Field Include="0" OldName="Old3" NewName="New3"/>
  </Document>
  <Document Include="1" DocumentName="Report2" >
    <Field Include="1" OldName="Old1" NewName="New1"/>
    <Field Include="0" OldName="Old3" NewName="New3"/>
  </Document>
</Documents>

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

class FieldMap
{
    public string OldName { get; set; }
    public string NewName { get; set; }
}

class Document
{
    public string DocumentName { get; set; }
    public List<FieldMap> FieldMaps;
}

private List<Document> Documents;

Ниже приведен код, который выполняет первую часть путем заполнения документов:

var ds = from row in elem.Descendants("Document")
         where row.Attribute("Include").Value == "1"
         select new Document
         {
            DocumentName = row.Attribute("DocumentName").Value,
         };

Documents = ds.ToList<Document>();

Я хотел бы изменить приведенный выше код, чтобы он также заполнял структуру списка в каждом документе. Я знаю, что мог бы сделать это, перебирая список документов <> и выполняя еще один запрос LINQ в цикле, однако я бы предпочел сделать все как консолидированный запрос.

1 Ответ

2 голосов
/ 15 июня 2009

Вы пробовали что-то вроде этого:?

var ds = from row in elem.Descendants("Document")
         where row.Attribute("Include").Value == "1"
         select new Document
         {
            DocumentName = row.Attribute("DocumentName").Value,
            FieldMaps =    //Solution from here
               (from field in row.Descendants ("Field")
                where field.Attribute("Include").Value == "1"
                select new FieldMap {
                    OldName = field.Attribute("OldName").Value,
                    NewName = field.Attribute("NewName").Value
                }).ToList () //To here
         };

Documents = ds.ToList<Document>();

Некоторые люди говорят, что проще заполнить свойства FielMaps вне запроса LINQ, используя foreach, я не согласен с этим, но если вам нравится эта альтернатива, она будет выглядеть примерно так:

var ds = from row in elem.Descendants("Document")
         where row.Attribute("Include").Value == "1"
         select new Document
         {
             DocumentName = row.Attribute("DocumentName").Value
         };

Documents = ds.ToList<Document>();

foreach (var document in Documents)
    document.FieldMaps = elem.Descendants("Document")
        .Where(doc => doc.Attributes("DocumentName") == document.DocumentName)
        .Select(doc => doc.Descendants("Fields"))
        .Where(field => field.Attributes("Include").Value == "1")
        .Select(field => new FieldMap
            {
                OldName = field.Attributes("OldName").Value,
                newName = field.Attributes("NewName").Value
            }
        ).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...