Как я могу проверить, если этот XElement не является нулевым, прежде чем добавить его в анонимный объект? - PullRequest
2 голосов
/ 13 октября 2010

Я заполняю анонимный объект из файла XML.До сих пор

commentary.Elements("Commentator")

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

Я смотрю на код и не знаю, что изменить, хотя, потому что он выбрансвойство анонимного объекта.

var genericOfflineFactsheet = new
    {
        Commentary = (from commentary in doc.Elements("Commentary")
                      select new
                      {
                          CommentaryPage = (string)commentary.Attribute("page"),
                          BusinessName = (string)commentary.Attribute("businessName"),
                          Commentator = (from commentator in commentary.Elements("Commentator")
                                         select new CommentatorPanel // ASP.NET UserControl
                                         {
                                             CommentatorName = (string)commentator.Attribute("name"),
                                             CommentatorTitle = (string)commentator.Attribute("title"),
                                             CommentatorCompany = (string)commentator.Attribute("company")
                                         }).FirstOrDefault()
                      }).FirstOrDefault()

Дело в том, что я не могу полностью удалить строку, потому что иногда commentary.Elements("Commentator") имеет значение.Я уверен, что эта проблема уже решалась, но я не вижу, что делать.Есть идеи?

Ответы [ 4 ]

2 голосов
/ 13 октября 2010

Просто добавьте нулевую проверку. (код ниже должен быть хорошим тестером. Имеет один с и без комментатора)

XDocument doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    new XComment("Example"),
new XElement("Commentarys",
        new XElement("Commentary",
            new XAttribute("page", "2"),
            new XAttribute("businessName", "name"),
            new XElement("Commentator",
               new XAttribute("name", "name"),
                new XAttribute("title", "title")
            )
         )
        ,
        new XElement("Commentary",
            new XAttribute("page", "3"),
            new XAttribute("businessName", "name2")

            )
    )
    );
var genericOfflineFactsheet = new
{
    Commentary = (
           from commentary in doc.Elements()
                .First().Elements("Commentary")
           select new
          {
              CommentaryPage = (string)commentary.Attribute("page"),
              BusinessName = (string)commentary.Attribute("businessName"),
              Commentator = (from commentator in commentary.Elements("Commentator")
                             where commentator != null //<-----you need to add this line
                             select new // ASP.NET UserControl
                             {
                                 CommentatorName = (string)commentator.Attribute("name"),
                                 CommentatorTitle = (string)commentator.Attribute("title"),
                                 CommentatorCompany = (string)commentator.Attribute("company")
                             }

                             ).FirstOrDefault()
          }
 ).FirstOrDefault()
};
1 голос
/ 13 октября 2010

Это тот случай, когда я мог бы рассмотреть ??(coalesce) оператор.

null ?? x --> x

В этом случае вы можете избежать слияния с пустым Enumerable.

1 голос
/ 13 октября 2010

Непроверено ...

как насчет чего-то вроде:

  XElement xe = doc.Elements("Commentary").FirstOrDefault();
  Commentary = xe == null ? null :
    select new { ....snip....
0 голосов
/ 19 апреля 2013

Я использую?используйте этот способ, чтобы предотвратить создание XMLElement:

  • если объект, который я использую, не равен нулю, я возвращаю один новый XElement в массиве
  • , если он равен нулю, явернуть Enumerable.Empty

Пример:

var xml = new XElement("Root",
    myobject == null ? Enumerable.Empty<XElement>() : <= empty IEnumerable if it is null
                       new []                         <= a array with a XElement
                           { 
                               new XElement("myobject", 
                                   new XAttribute("Name", myobject.Name),
                                   new XAttribute("Type", myobject.Type)
                               ...)
                           },
    ...);

В этом случае XElement не будет сгенерирован, если объект, участвующий в его создании, равен нулю.

...