考虑以下代码
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";