【问题标题】:how to declare functions using linq-to-xml queries?如何使用 linq-to-xml 查询声明函数?
【发布时间】:2013-08-11 12:39:52
【问题描述】:

我是 vb.net 和 linq-to-xml 的新手。我正在尝试将常用查询封装到函数中,以便将它们链接起来。

From tag in myelement where ... select ...

上面,myelement 可以是 IEnumerable(Of XElement) 或 XElement,Visual Studio 对此没有任何问题。但是如果我定义一个函数

Function select_items(ByRef myelement As IEnumerable(Of XElement), ByVal name As String) As IEnumerable(Of XElement)
    Dim tags = _
        From tag In myelement.Elements(ns + "item")
        Where tag.Element(ns + "cc").Attribute("S") = "ITEM" _
        AndAlso tag.Element(ns + "cc").Value = name
        Select tag
    Return tags
End Function

如果我没有为 myelement 输入类型,则会出现错误

Expression of type 'Object' is not queryable. Make sure you are not missing an assembly reference and/or namespace import for the LINQ provider.

如果我将“myelement As Xelement”放在函数声明中,然后我在参数中使用 IEnumerable(of XElement) 调用该函数,则会显示错误

Unable to cast object of type 'WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.Xml.Linq.XElement]' to type 'System.Xml.Linq.XElement'.

如果我输入“myelement As IEnumerable(of Xelement)”并用 XElement 调用它,我会得到相同的错误反转

所以问题是:我应该如何声明我的函数具有与 from/in/where/select 语句相同的多态性?

谢谢

【问题讨论】:

    标签: vb.net function linq-to-xml


    【解决方案1】:

    您可以在XElementIEnumerable(Of XElement) 上调用Elements,但两者调用的方法不同!

    第一个真的是XContainer.Elements(name as XName)方法调用(可以带String参数调用,因为提供了Implicit(String to XName)转换)。第二个是在IEnumerable(Of T As XContainer)上设置的扩展方法。

    要使您的方法同时适用于XElementIEnumerable(Of XElement)(或更一般地适用于XContainerIEnumerable(Of XContainer),您还必须提供两种方法:

    Function select_iems(ByRef myelement As XContainer, ByVal name As String) As IEnumerable(Of XContainer)
        Return select_items(New List(Of XContainer)(1) From {myelement}, name)
    End Function
    
    Function select_items(ByRef myelement As IEnumerable(Of XContainer), ByVal name As String) As IEnumerable(Of XContainer)
        Dim tags = _
            From tag In myelement.Elements(ns + "item")
            Where tag.Element(ns + "cc").Attribute("S") = "ITEM" _
            AndAlso tag.Element(ns + "cc").Value = name
            Select tag
        Return tags
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多