/ / Come dichiarare le funzioni usando le query da linq a xml? - vb.net, funzione, linq-to-xml

come dichiarare le funzioni usando le query linq-to-xml? - vb.net, funzione, linq-to-xml

Sono nuovo a vb.net e linq-to-xml. Sto cercando di incapsulare le query usate spesso in funzioni, così posso ricondurle dopo.

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

Sopra, myelement può essere un IEnumerable (Of XElement) o un XElement e lo studio visivo non ha problemi con questo. Ma se definisco una funzione

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

Se non metto nessun tipo per myelement, ho l'errore

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

Se metto "myelement As Xelement" nella dichiarazione di funzione, allora chiamo la funzione con un oggetto IEnumerable (di XElement), mostra un errore

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

Se metto "myelement As IEnumerable (of Xelement)" e lo chiamo con XElement, ottengo lo stesso errore invertito

Quindi la domanda è: come dovrei dichiarare la mia funzione di avere lo stesso tipo di polimorfismo che hanno le istruzioni da / in / where / select?

Grazie

risposte:

0 per risposta № 1

Puoi chiamare Elements su entrambi XElement e IEnumerable(Of XElement), ma entrambi non stanno chiamando lo stesso metodo!

Il primo è davvero XContainer.Elements(name as XName) chiamata al metodo (puoi chiamarla con String parametro, perché non c'è Implicit(String to XName) conversione fornita). Il secondo è un metodo di estensione impostato su IEnumerable(Of T As XContainer).

Per far funzionare il tuo metodo con entrambi XElement e IEnumerable(Of XElement) (o più generale con XContainer e IEnumerable(Of XContainer) devi fornire anche due metodi:

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