Создать один и тот же анонимный тип LINQ из другого элемента XML - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть такой XML-файл: - XML file

Обратите внимание, что у каждого <Field></Field> может быть свой элемент, например выделенный <I32> или <String>. Я хочу показать имя элемента в виде таблицы данных, например, это Type для имени элемента (или I32, или String, или другой дочерний элемент <Field>): - Datagridview

Пока что я пробовал этот код, но он возвращает An unhandled exception of type 'System.NullReferenceException'.

XDocument doc = XDocument.Load("GetLotDetails.xml");
var data = doc.Descendants("Document").Where(x => (String)x.Attribute("name") == "DATA").SelectMany(x => x.Elements("Field"));
var query = from d in data
            let str = d.Element("String").Name
            let other = d.Element("I32").Name
            select new
            {
                 Name = d.Attribute("name").Value,
                 Type = str.Equals("String") ? "String" : (other.Equals("I32") ? "I32" : null),        
                 Value = d.Value,
            };
dataGridView1.DataSource = query.ToList();

Итак, идея состоит в том, чтобы позволить анониму Type = *whatever element name under field*. Как можно извлечь другое имя элемента в операторе выбора LINQ и присвоить его той же переменной неизвестного типа?

1 Ответ

0 голосов
/ 05 ноября 2018

Это не имеет ничего общего с анонимными типами. Вы пропускаете нулевую проверку

var query = 
    from d in data
    let element = d.Element("String") ?? d.Element("I32")
    select new
    {
        Name = d.Attribute("name").Value,
        Type = element?.Name,
        d.Value
    };

В исходном запросе вы безоговорочно читаете Name с обоих возможных узлов, но для любого заданного d один из узлов будет null. Я мог бы написать это, используя нулевой условный оператор, d.Element("String")?.Name, но вышеизложенное более читабельно в этом контексте, поскольку дополнительная проекция в вашем исходном запросе добавляет шум и потенциальную путаницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...