考虑以下代码
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语句? 感谢
答案 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";