假设我在SQL Server中有一个表,其中包含带有内部联接的查询结果。
以下XQuery:
select @code.query
(
'for $s in /root/row
return
<Foo Language="{data($s/@lang)}" Method="{data($s/@method)}" Returns="{data($s/@returnType)}">
<Bar ReferencedBy="{data($s/@callers)}" Static="{data($s/@static)}" />
</Foo>'
)
结果:
<Foo Language="C#" Method="getFoos" Returns="FooCollection">
<Bar ReferencedBy="Baz" Static="true" />
</Foo>
<Foo Language="C#" Method="getFoos" Returns="FooCollection">
<Bar ReferencedBy="Bar" Static="false" />
</Foo>
我想要的是以下内容:
<Foo Language="C#" Method="getFoos" Returns="FooCollection">
<Bar ReferencedBy="Baz" Static="true" />
<Bar ReferencedBy="Bar" Static="false" />
</Foo>
使用XQuery执行此操作的最佳方法是什么,以避免使用LINQ和哈希表?
答案 0 :(得分:1)
在构造结果之前,您需要使用每种语言,方法和返回值枚举所有节点
for $lang in distinct-values(/root/row/@lang)
let $nodes := /root/row[@lang=$lang]
for $method in distinct-values($nodes/@method)
let $nodes := $nodes[@method=$method]
for $return in distinct-values($nodes/@returnType)
let $nodes := $nodes[@returnType=$returnType]
return
<Foo Language="{$lang}"
Method="{$method}"
Returns="{$returnType}">
{
for $bar in $nodes
return
<Bar ReferencedBy="{data($node/@callers)}"
Static="{data($node/@static)}" />
}
</Foo>
我自己不使用SQL Server,所以我不能保证这会起作用,但它是一个有效的XQuery解决方案。