¿Cómo puedo verificar si este XElement no es nulo antes de agregarlo a un objeto anónimo?

Estoy rellenando un objeto anónimo de un archivo XML. Hasta ahora,

commentary.Elements("Commentator")

Siempre ha tenido un valor, así que nunca he tenido que comprobar si hay un valor nulo. Sin embargo, tuve que eliminar eso, y ahora está fallando cuando intenta leer esa línea.

Estoy mirando el código y no sé qué cambiar, porque se está seleccionando en una propiedad de un objeto anónimo.

 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() 

La cuestión es que no puedo eliminar completamente la línea porque a veces el commentary.Elements("Commentator") tiene un valor. Estoy seguro de que este problema se ha tratado antes, pero no puedo ver qué hacer. ¿Algunas ideas?

Simplemente añada un cheque nulo. (el código a continuación debe ser un buen probador. Tiene uno con y otro sin comentarista)

 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() }; 

Sin probar …

¿Qué tal algo como:

  XElement xe = doc.Elements("Commentary").FirstOrDefault(); Commentary = xe == null ? null : select new { ....snip.... 

Este es un caso en el que podría considerar el ?? (coalesce) operador.

 null ?? x --> x 

En este caso, podría salirse con la fusión de un Enumerable vacío.

Yo uso el ? Operador de esta manera para evitar que se genere un XMLElement:

  • si el objeto que uso no es nulo, devuelvo un nuevo XElement en una matriz
  • Si es nulo, devuelvo un Enumerable.Empty

Ejemplo:

 var xml = new XElement("Root", myobject == null ? Enumerable.Empty() : <= 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) ...) }, ...); 

En este caso, XElement no se generará si el objeto involucrado en su creación es nulo.