在Linq中使用“not StartsWith”时出现NullReferenceException

时间:2012-07-25 12:28:17

标签: c# linq

我正在尝试删除所有具有不以特定文本

开头的属性值的元素

感谢Jon Skeet我得到了第一部分但是有些元素不包含这个属性,因此我得到了NullReferenceExpection的消息:“对象引用未设置为对象的实例”

我添加了额外的空值检查,但它仍然没有任何作用?

elements =(from el in xmlFile.Root.Elements(elementName)
where ( !el.Attribute(attributeName).Value.Equals(DBNull.Value)
&& !el.Attribute(attributeName).Value.StartsWith(searchBeforeStar))
select el);

2 个答案:

答案 0 :(得分:3)

Equals属性上调用null会触发异常。将XAttribute的值与DBNull进行比较是没有必要的(事实上,这是不正确的),因为LINQ2XML使用“plain”null来表示缺少的属性。

试试这个:

elements =(from el in xmlFile.Root.Elements(elementName) where (
    el.Attribute(attributeName) != null &&
    el.Attribute(attributeName).Value != null && 
    !el.Attribute(attributeName).Value.StartsWith(searchBeforeStar)
)select el);

答案 1 :(得分:2)

在测试之前,您必须测试您的节点是否包含该属性。

添加el.Attribute(attributeName) != null

elements =(from el in xmlFile.Root.Elements(elementName) 
           where ( el.Attribute(attributeName) != null
                && !el.Attribute(attributeName).Value.Equals(DBNull.Value) 
                && !el.Attribute(attributeName).Value.StartsWith(searchBeforeStar))
           select el);