在带有 LINQ to XML 的 VB.NET 中,where 子句在属性值和字符串之间设置不区分大小写的比较

Posted

技术标签:

【中文标题】在带有 LINQ to XML 的 VB.NET 中,where 子句在属性值和字符串之间设置不区分大小写的比较【英文标题】:in VB.NET with LINQ to XML on where clause set case insensitive comparsion between attributes value and string 【发布时间】:2021-09-24 18:23:09 【问题描述】:

在使用 LINQ to XML 的 Vb.Net 中,我试图在 where 子句上设置不区分大小写的比较,然后我得到(对象引用不是对象的实例)。

 Dim CSFilePathName As String = File.ToString
                Dim CSDoc As XDocument = XDocument.Load(CSFilePathName)
                Dim CSquery2 As IEnumerable(Of XElement) = From element In CSDoc.Root.Descendants
                                                           Where element.@Column.Equals(RichTextBox8.Text, StringComparison.InvariantCultureIgnoreCase)
                                                           Select element

任何想法我做错了什么?

【问题讨论】:

您正在处理的 XML 样本在哪里? 【参考方案1】:

当 XElement 上不存在 Column 属性时,您将收到此异常。以这个 XML 为例:

<root>
  <child Column="1">Column1</child>
  <child>No Column</child>
</root>

这会引发异常,因为第二个&lt;child&gt; 没有Column 属性。

要解决这个问题,您需要先检查该属性是否存在:

Dim CSquery2 As IEnumerable(Of XElement) = From element In CSDoc.Root.Descendants
                                           Where element.Attribute("Column") IsNot Nothing AndAlso element.@Column.Equals(RichTextBox8.Text, StringComparison.InvariantCultureIgnoreCase)
                                           Select element

示例:https://dotnetfiddle.net/R1nk8r

【讨论】:

【参考方案2】:

问题在于 .Equals。

    Dim xe As XElement = <root>
                             <child Column="a">Column1</child>
                             <child>No column attribute</child>
                             <child Column="A">Column1</child>
                         </root>

使用该数据试试这个,

    Dim ie As IEnumerable(Of XElement)
    ie = From element In xe.Elements
            Where Not String.IsNullOrEmpty(element.@Column) AndAlso
              element.@Column.Equals("a", StringComparison.InvariantCultureIgnoreCase)
            Select element

请注意,这是可行的

    Dim ie As IEnumerable(Of XElement)
    ie = From element In xe.Elements
            Where element.@Column = "a" OrElse element.@Column = "A"
            Select element

【讨论】:

以上是关于在带有 LINQ to XML 的 VB.NET 中,where 子句在属性值和字符串之间设置不区分大小写的比较的主要内容,如果未能解决你的问题,请参考以下文章

在 VB.NET 中使用带有匿名方法的 LINQ 的 ForEach

VB.Net Linq to Entities Null 比较 - “啥都没有”或“= 啥都没有”?

使用带有 ADO 的 Excel 2010 VBA(或带有 LINQ 的 vb.net)查询表的最佳 SQL 语句是啥

带有 XML 数据库字段的 Linq-to-SQL —— 为啥会这样?

使用带有 Xml 命名空间的 Linq to Xml

初识Linq to Entity