Как сгруппировать элементы по значениям атрибутов, используя XQuery на SQL Server? - PullRequest
0 голосов
/ 29 января 2010

Допустим, у меня есть таблица в 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 и хеш-таблице?

1 Ответ

1 голос
/ 30 января 2010

Вам нужно перечислить все узлы с каждым языком, методом и возвращаемым значением перед построением результатов

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.

...