未设置C#LINQ对象引用

时间:2013-02-07 12:01:28

标签: 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;

尝试query.ToList()

时,我得到'对象引用未设置'

当'x.Attribute(xmlAttributeIdName).Value == xmlAttributeIdValue'不存在时,这很可能是由'select guid.Value'引起的。

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

2 个答案:

答案 0 :(得分:3)

在XLinq中,您通常不会直接使用Attribute().Value,因为您遇到的确切错误。相反,你施展它。如果null返回null,则转换将导致Attribute(),因此不会有例外。

因此,您可以将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");

答案 1 :(得分:2)

如果没有属性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";