未设置C#LINQ对象引用



考虑以下代码

IEnumerable<String> query = null;    
query = from x in xml.Descendants(xmlMasterContainerName).Descendants(xmlElementName)
                    let guid = x.Attribute("guid") ?? new XAttribute("guid", "-1")
                    where x.Attribute(xmlAttributeIdName).Value == xmlAttributeIdValue
                    select guid.Value;

在尝试查询时,我得到了"未设置对象引用"。ToList()

这很可能是由"select guid"引起的。值"when"x。属性(xmlAttributeIdName)。Value==xmlAttributeIdValue"不存在。

在选择之前,如何检查where语句中的现有值?感谢

在XLinq中,通常不会直接使用Attribute().Value,因为会出现确切的错误。相反,您对其进行强制转换。如果Attribute()返回null,则强制转换将导致null,因此不会出现异常。

因此,您可以将where子句更改为:

where ((string)x.Attribute(xmlAttributeIdName)) == xmlAttributeIdValue

以及您对此的选择:

select (string)guid

BTW:我会这样写代码:

var query = xml.Descendants(xmlMasterContainerName)
               .Descendants(xmlElementName)
               .Where(x => ((string)x.Attribute(xmlAttributeIdName)) ==
                               xmlAttributeIdValue)
               .Select(x => (string)x.Attribute("guid") ?? "-1");

如果没有属性xmlAttributeIdName,则访问Value属性时会出现异常。请改用强制转换(它将返回默认值)。此外,您不需要创建属性-您可以简单地返回值:

IEnumerable<String> query = null;    
query = from x in xml.Descendants(xmlMasterContainerName)
                     .Descendants(xmlElementName)
        where (string)x.Attribute(xmlAttributeIdName) == xmlAttributeIdValue
        select (string)x.Attribute("guid") ?? "-1";

相关内容

  • 没有找到相关文章