私はvb.netとlinq-to-xmlが初めてです。頻繁に使用されるクエリを関数にカプセル化して、後でチェーンできるようにしようとしています。
From tag in myelement where ... select ...
上記の myelement は IEnumerable(Of XElement) または XElement にすることができ、ビジュアル スタジオはそれで問題ありません。しかし、関数を定義すると
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 ステートメントと同じ種類のポリモーフィズムを持つように関数を宣言するにはどうすればよいかということです。
ありがとうございました