Consulta para, bugs, tarefas e outros itens de trabalho

Você pode consultar bugs, tarefas, outros tipos de itens de trabalho, e links entre itens de trabalho usando um dos métodos de WorkItemStore.Query ou de um objeto de Query .Essas consultas usam a linguagem de consulta (WIQL) de item de trabalho, que lembra o transact-sql.

TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(
      new Uri("https://server:8080/tfs/DefaultCollection"));
WorkItemStore workItemStore = (WorkItemStore)tpc.GetService(typeof(WorkItemStore)); 
WorkItemCollection queryResults = workItemStore.Query("
   Select [State], [Title] 
   From WorkItems
   Where [Work Item Type] = 'User Story'
   Order By [State] Asc, [Changed Date] Desc");
Dim collectionUri As Uri
collectionUri = New Uri("https://Server:8080/tfs/DefaultCollection")
Dim tpc As New TfsTeamProjectCollection(collectionUri)
Dim workItemStore As WorkItemStore
workItemStore = tpc.GetService(Of WorkItemStore)()
Dim queryResults As WorkItemCollection
queryResults = workItemStore.Query(“
  Select [State], [Title]
  From WorkItems
  Where [Work Item Type] = ‘User Story’
  Order By [State] Asc, [Changed Date] Desc”)

Neste tópico

Permissões Necessárias

Uma consulta retorna apenas estes itens de trabalho que você tem permissão de Exibir itens de trabalho ou de Exibir itens de trabalho em este nó .Normalmente, essas permissões são concedidas a membros de Leitores e grupos de Colaboradores para cada projeto de equipe.Para obter mais informações, consulte Team Foundation Permissões do servidor.

DicaDica

Para explorar os detalhes de linguagem de consulta de item de trabalho, crie consultas usando Team Explorer, e então salve as como arquivos de .wiql.Renomear arquivos para usar a extensão .xml, e para abri-las no Visual Studio.Procure o elemento de wiql para ver como cada consulta é expressa na linguagem de consulta de item de trabalho.

Linguagem de consulta

A linguagem de consulta de item de trabalho tem cinco partes.

          Select [State], [Title] 
From WorkItems
Where [Work Item Type] = 'User Story'
Order By [State] Asc, [Changed Date] Desc
AsOf '6/15/2010'

Select [State], [Title]

Identifica cada Field cujo valor será definido em cada WorkItem retornado pela consulta.Você pode especificar o nome para exibição ou o nome da referência do campo.Você deve usar os colchetes ([]) se o nome contém placas ou pontos.

Observação de cuidadoCuidado
você pode usar WorkItem que foi retornado por uma consulta para obter o valor de Field, mesmo se a consulta não retornou o valor.Se você fizer isso, outra processamento para o servidor ocorrerá.Para obter mais informações, consulte Valores de campo de paginação.

From WorkItems

Indica se você desejar que a consulta para localizar itens de trabalho ou links entre itens de trabalho.

From WorkItems

Use para itens de trabalho.

From WorkItemLinks

Use para links entre itens de trabalho.Para obter mais informações, consulte Consultas para links entre itens de trabalho.

Where [Work Item Type] = 'User Story'

Especifica os critérios de filtragem para a consulta.Para obter mais informações, consulte Cláusula where neste tópico posteriormente.

Order By [State] Asc, [Changed Date] Desc

(Opcional) especifique como classificar WorkItemCollection que a consulta retorna.

AsOf '6/15/2010'

(Opcional) especifique uma consulta históricas indicando uma data ou um ponto no tempo em que o filtro deve ser aplicado.Por exemplo, esta consulta retorna todas as histórias de usuário que existiam o 15 de junho de 2010.

ObservaçãoObservação
Você não pode criar consultas de AsOf no construtor de consultas no Visual Studio.Se você criar um arquivo de consulta (.wiq) que inclua uma cláusula de AsOf e em seguida, carregue no Visual Studio, a cláusula de AsOf será ignorada.

Cláusula where

Onde a cláusula especifica os critérios de filtragem para uma consulta de itens de trabalho.O retorna de consulta trabalham somente os itens que satisfazem às condições.A seguinte consulta de exemplo retorna as histórias de usuário que são ativos e atribuídas a você.

Where [Work Item Type] = 'User Story'
AND [State] = ‘Active’
AND [Assigned to] = @Me

Você pode controlar a ordem em que os operadores lógicos são avaliados se você usar parênteses para agrupar critérios de pesquisa.Por exemplo, para retornar os itens de trabalho que são atribuídos ou ou que você altera fechado, o filtro de consulta para coincidir com o seguinte exemplo:

Where [Work Item Type] = 'User Story'
AND [State] = ‘Active’
AND ( [Assigned to] = @Me
OR [Closed by] = @Me )

A tabela a seguir descreve a sintaxe da cláusula where:

Sintaxe

Exemplo

cláusula Where

Where FilterCondition [Group|{LogicalOperator FilterCondition}]

Group

(FilterCondition LogicalOperator FilterCondition [LogicalOperator Filter Condition]…)

([Assigned to] = @Me OR [Created by = @Me])

Os operadores lógicos de agrupamento são AND e OR.

FilterCondition

Field ComparisonOperator Value

[Work Item Type] = ‘Help Topic’

Você pode especificar o nome de referência ou o nome para exibição de um campo.Se o nome contém espaços ou períodos, você deve colocá-lo entre colchetes ([]).

Operadores de comparação são descritos em Operadores de Comparação posteriormente em este tópico.

Para o valor, você pode especificar um valor literal do artigo usuário (“") ou uma macro@Me().

Valor

LiteralValue|Variable|Field

'User Story'

valor literal

O valor real para comparar o valor do campo.Para obter mais informações, consulte valores literais neste tópico posteriormente.

Variável

Uma expressão que indica qualquer valor.por exemplo, o @Me indica a pessoa que está executando a consulta.Para obter mais informações, consulte As variáveis neste tópico posteriormente.

Campo

O nome de outro campo.Por exemplo, você pode usar [Assigned to] = [Changed by]para localizar itens de trabalho que são atribuídos a pessoa que alterou o item de trabalho recentemente.

Bb130306.collapse_all(pt-br,VS.110).gifOperadores de Comparação

Você pode usar os operadores na tabela a seguir para especificar como um campo deve se relacionar ao valor correspondente:

Operador de consulta

Descrição

Tipos de campos aplicáveis

=

Corresponde ao valor.

Número, texto, Data, Árvore

<>

Não corresponde ao valor.

Número, texto, Data, Árvore

>

É maior que o valor.

Número, texto, data

<

É menor que o valor.

Número, texto, data

>=

É maior que ou igual ao valor.

Número, texto, data

<=

É menor ou igual ao valor.

Número, texto, data

Contém

Contém a cadeia de caracteres.

Texto

Não contém

Não contém a cadeia de caracteres.

Texto

Em

Corresponde a qualquer valor em um conjunto delimitado por vírgulas.Por exemplo, localiza de [System.Id] In (100, 101, 102) itens de trabalho cujos IDs são 100, 101, e 102.

Número, texto, Data, Árvore

Em Grupo

É um membro do grupo.O grupo pode ser um grupo de Team Foundation[Assigned to] In Group [Project]\Contributors() ou uma categoria de item de trabalho quando você usa o com o campo de tipo de item de trabalho ([Work Item Type] In Group Requirements).Para obter informações sobre grupos de categorias, consulte Definir categorias para agrupar os tipos de item de trabalho.

Texto

Não em Grupo

Não é um membro do grupo.Para obter mais informações, consulte a entrada para In Group.

Texto

Já Foi

Corresponde se o campo nunca corresponde ao valor, mesmo se foi alterado para um valor diferente.

Texto, Data

Sob

Para áreas e iterações, corresponde se o item de trabalho está no nó ou em qualquer um dos seus filhos.Para obter informações sobre as áreas e de iterações, consulte Criar e modificar áreas e iterações.

Tree

Não Sob

Para áreas e iterações, corresponde se o item de trabalho não está no nó ou em qualquer dos seus filhos.

Tree

Bb130306.collapse_all(pt-br,VS.110).gifAs variáveis

Você pode usar variáveis nas consultas para passar entrada do usuário ou valores calculados.Para criar uma consulta que inclui variáveis, crie os espaços reservados na cadeia de caracteres de consulta usando @variable.Passar o nome e o valor de cada variável para o método de consulta usando uma implementação de IDictionary, como o exemplo a seguir mostra

// Define a query that uses a variable for the type of work item. 
string queryString = "Select [State], [Title] From WorkItems Where [Work Item Type] = @Type";

// Set up a dictionary to pass "User Story" as the value of the type variable.
Dictionary<string, string> variables = new Dictionary<string, string>();
variables.Add("Type", "User Story");

// Create and run the query.
Query query = new Query(workItemStore, queryString, variables); 
WorkItemCollection results = query.RunQuery();
// Define a query that uses a variable for the type of work item.
Dim queryString As New StringBuilder("SELECT [State], [Title] FROM WorkItems WHERE [WorkItemtype] = @Type")

// Set up a dictionary to pass "User Story" as the value of a type variable.
Dim variables = New Dictionary(Of String, String)
variables.Add("Type", "User Story")

// Create and run the query.
Dim query As New Query(workItemStore, queryString, variables)                   
WorkItemCollection results = query.RunQuery()

Você também pode usar @Me ou @Today em sua consulta sem fornecer valores para as variáveis.Quando essas variáveis aparecem na consulta mas não têm nenhum valor associado passado na implementação de IDictionary , variáveis são avaliados como a tabela a seguir descreve:

Variável

Uso

@Me

Indica o usuário atual em um campo que contém nomes de usuário.Por exemplo, você pode localizar itens de trabalho que você ativou se você especificar [Activated by] =@Me.

@Today

indica a data atual.Você também pode modificar a variável de @Today adicionando ou subtraindo dias.Por exemplo, você pode localizar todos os itens que foram ativados na última semana se você especificar [Activated Date] > @Today - 7.

Bb130306.collapse_all(pt-br,VS.110).gifvalores literais

Quando você especificar um valor para cada campo, o valor deve corresponder ao tipo de dados de aquele campo.Todos os campos em Team Foundation têm um dos tipos de dados que são listados na tabela a seguir:

Tipo de dados

Dados armazenados

DateTime

um valor de datetime como definido por SQL Server.Por padrão, os valores de DateTime em consultas de itens de trabalho são tratados como tendo a precisão de data.Por exemplo, um item de trabalho que seja criado a qualquer momento do dia o 1º de junho de 2010, corresponde aos critérios de [Created Date] = 6/1/2010de filtro.

Para obter mais informações, consulte Métodos de consulta e o objeto de consulta posteriormente em este tópico e na seguinte página no site da Microsoft: datetime (transact-sql).

Double

Um número real, como 0,2 ou 3,5.

GUID

Uma cadeia de caracteres que representa um GUID.

HTML

Cadeias de caracteres de texto que contém o HTML.

Integer

Um inteiro de 32 bits que é assinado, como 0, 1, 2 ou 34.

PlainText

Uma cadeia de caracteres de texto sem formatação que pode ser maior de 255 caracteres.

Cadeia de caracteres

Uma cadeia de caracteres de texto que contém até 255 caracteres.

TreePath

Uma estrutura de árvore de ramificação, como uma área ou uma iteração.

Você também pode usar consultas para localizar os links entre itens de trabalho.Uma condição no onde a cláusula pode aplicar aos links ou qualquer item de trabalho que é a origem ou o destino de um link.A tabela a seguir resume as diferenças entre esses tipos de consultas e consultas somente para itens de trabalho:

Itens de trabalho

Links entre itens de trabalho

cláusula From

De WorkItems

De WorkItemLinks

cláusula Where

[FieldName] = Value

Um dos seguintes:

[Source].[FieldName] = Value

[Target].[FieldName] = Value

[System.Links.LinkType] = 'LinkName'

Modo

Um dos seguintes:

mode(MustContain)

(Padrão) apenas os registros de WorkItemLinkInfo onde todos a origem, o destino, e os critérios de link são satisfeitos.

mode(MayContain)

Registros de WorkItemLinkInfo de retorna para todos os itens de trabalho que satisfaçam critérios de origem e de link, mesmo se nenhum item de trabalho vinculado satisfaz os critérios de destino.

mode(DoesNotContain)

Registros de WorkItemLinkInfo de retorna para todos os itens de trabalho que satisfazem a origem, somente se nenhum item de trabalho vinculado satisfaz os critérios de link e de destino.

Retornos

[ T:Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemCollection ]

uma matriz de WorkItemLinkInfo.

A seguinte consulta retorna os links entre as histórias de usuário e os seus filhos ativos.

SELECT [System.Id]
FROM WorkItemLinks
WHERE ([Source].[System.WorkItemType] = 'User Story')
  And ([System.Links.LinkType] = 'Child')
  And ([Target].[System.State] = 'Active')
mode(MustContain)

Métodos de consulta e o objeto de consulta

Você pode ver para itens de trabalho usando o método de WorkItemStore.Query .Você também pode identificar o número de itens de trabalho que satisfazem uma consulta sem retornar todos os itens de trabalho usando o método de WorkItemStore.QueryCount .

você pode criar um objeto de Query para definir e executar consultas.

string queryString = "Select [Title] From WorkItems Where [Work Item Type] = 'User Story'"
Query query = new Query(workItemStore, queryString); 
int numWorkItems = query.RunCountQuery();
Console.WriteLine("The project collection has " + numWorkItems.ToString() + " user stories.");
Dim queryString As New StringBuilder("Select [Title] FROM WorkItems WHERE [WorkItemType] = 'User Story'"
Dim query As New Query(workItemStore, queryString)
Dim numWorkItems As Int
numWorkItems = query.RunCountQuery()
Console.Writeline("The project collection has " + numWorkItems.ToString() + " user stories.")

consultas assíncronos

você pode executar consultas de forma assíncrona usando o método de Query.BeginQuery .O exemplo executa uma consulta de forma assíncrona e cancela a consulta após um período de tempo limite muito tempo.

// Run the query asynchronously, and time out after 0.05 seconds. 
ICancelableAsyncResult callback = query.BeginQuery();
callback.AsyncWaitHandle.WaitOne(50, false); 
if (!callback.IsCompleted) 
{
   callback.Cancel();
   Console.WriteLine("The query timed out");
}
else
{
   WorkItemCollection nextResults = query.EndQuery(callback); 
   Console.WriteLine("The project collection has " + nextResults.Count.ToString() + " work items."); 
}
Dim callback as ICancelableAsyncResult
callback = query.RunQuery()
callback.AsyncAWaitHandle.WaitOne(50, False)
If Not (callback.IsCompleted)
Then
callback.Cancel()
Console.Writeline("The query timed out")
Else
Dim nextResults As WorkItemCollection = query.EndQuery(callback)
Console.Writeline("The project collection has " + nextResults.Count.ToString() + " work items.") 
End If

Valores de campo de paginação

WorkItemCollection que retorna uma consulta contém valores para os campos seguintes:

  • ID

  • Rev (revisão)

  • AreaID

  • IterationID

  • WorkItemType

Os valores dos campos que você especificar na cláusula SELECT são retornados em páginas.

ObservaçãoObservação

Por padrão, cada página contém os campos selecionados para 50 itens de trabalho.você pode ajustar o tamanho de uma página usando WorkItemCollection.PageSize.

Você pode minimizar viagens de ida e volta para o servidor selecionando todos os campos que seu código irá usar.O código a seguir faz processamento para a consulta e uma viagem para retornar todas as vezes em uma página de títulos que uma nova página é acessada.

WorkItemCollection results = WorkItemStore.Query(
   "SELECT Title FROM Workitems WHERE (ID < 1000)"); 
foreach (WorkItem item in results) 
{
   Console.WriteLine(item.Fields["Title"].Value);
}

Se seu código acessa um campo que você não especificar na cláusula SELECT, o campo é adicionado ao conjunto de campos paginados.Outra processamento é executada para atualizar a página para incluir os valores de aquele campo.

Sintaxe da consulta (EBNF)

O formato Backus-Naur (EBNF) é estendido para metalinguagem que descreve a gramática de idiomas de uma maneira mais compacta e ambígua.Este bloco de código usa EBNF para descrever a gramática de linguagem de consulta (WIQL) de item de trabalho.

Se você não estiver familiarizado com o EBNF, consulte uma descrição alternativo de WIQL em Syntax for the Work Item Query Language.

<select> ::= <flat-select> | <one-hop-select> | <recursive-select>

<flat-select> ::= select <field list>
from workitems
[ where <expression> ]
[ order by <order by field list> ]
[ asof <datetime> ]

<one-hop-select> ::= select <field list>
from workitemlinks
[ where <one-hop-link-expression>  <source-expression>  <target-expression> ]
[ order by <source-target order by field list> ]
[ asof <datetime> ]
mode( mustcontain | maycontain | doesnotcontain )

<recursive-select> ::= select <field list>
from workitemlinks
where <recursive-link-expression> [ and <source-expression> <target-expression> ]
mode ( recursive | returnmatchingchildren )

<expression> ::= <expression4>

<expression4> ::= <expression3> [ or <expression4> ]
<expression3> ::= <expression2> [ and <expression3> ]

<expression2> ::=   {[ not | ever ] <expression2> }
                          | <expression1>

<expression1> ::= <conditional expression>

<conditional expression> ::=   { '(' <expression> ')' }  | <field reference name> <conditional operator> <value>  | <field reference name> [not] in '(' <value list> ')'

<value> ::= <number>
| <string>
| <datetime>

<value list> ::= <value> [ ',' <value list> ]

<conditional operator> ::=   { '=' | '<>' | '<' | '<=' | '>' | '>=' } 
                             | { [ever] [not] { like | under }} 
<link operator> ::= '=' | '<>'

<field list> ::= <field name> [ ',' <field list> ]
<order by field list> ::= <order by field> [ ',' <order by field list> ]
<source-target order by field list> ::= [ <source> |<target> ] <order by field> [ ',' <source-target order by field list> ]
<order by field> ::= <field name> [ 'asc' | 'desc' ]

<number> ::= [ '-' ] <digit>* [ '.' [ <digit>* ]] [ { e | E } [ '-' ] <digit>* ]

<string> ::=   { ''' { <anychar except '''> | '''' }* ''' } 
                 | { '"' { <anychar except '"'> | '""' }* '"' }

<datetime> ::= <string>

<source> ::= '[source].'
<target> ::= '[target].'

<one-hop-link-expression> ::= <one-hop-link-expression4> | ''

<one-hop-link-expression4> ::= <one-hop-link-expression3> [ or <one-hop-link-expression4> ]
<one-hop-link-expression3> ::= <one-hop-link-expression2> [ and <one-hop-link-expression3> ]

<one-hop-link-expression2> ::= {[ not | ever ] <one-hop-link-expression2>}
                         | <one-hop-link-expression1>

<one-hop-link-expression1> ::= <conditional-link-expression>

<conditional-link-expression> ::= { '(' <one-hop-link-expression> ')' } | <linktype-field> <link operator> <linktype-name><linktype-direction> | <linktype-field> [not] 'in  (' <linktype list> ')'

<recursive-link-expression> ::= <linktype-field> '=' <linktype-name>'-forward'

<linktype list> ::= <linktype-name><linktype-direction> [, <linktype-name><linktype-direction>]

<linktype-direction> ::= '-forward' | '-reverse'

<source-expression> ::= <source-expression4> | ''

<source-expression4> ::= <source-expression3> [ or <source-expression4> ]
<source-expression3> ::= <source-expression2> [ and <source-expression3> ]

<source-expression2> ::=   {[ not | ever ] <source-expression2> }
                          | <source-expression1>

<source-expression1> ::= <conditional-source-expression>

<conditional-source-expression> ::=   { '(' <source-expression> ')' }  | <source><field reference name> <conditional operator> <value>  | <source><field reference name> [not] in '(' <value list> ')'

<target-expression> ::= <target-expression4> | ''

<target-expression4> ::= <target-expression3> [ or <target-expression4> ]
<target-expression3> ::= <target-expression2> [ and <target-expression3> ]

<target-expression2> ::=   {[ not | ever ] <target-expression2> }
                          | <target-expression1>

<target-expression1> ::= <conditional-target-expression>

<conditional-target-expression> ::=   { '(' <target-expression> ')' }  | <target><field reference name> <conditional operator> <value>  | <target><field reference name> [not] in '(' <value list> ')'

<linktype-field> ::= '[System.Links.LinkType] = '
<select> ::= select <field list>
from workitems
[ where <expression> ]
[ order by <order by field list> ]
[ asof <datetime> ]

<expression> ::= <expression4>

<expression4> ::= <expression3> [ or <expression4> ]
<expression3> ::= <expression2> [ and <expression3> ]

<expression2> ::=   {[ not | ever ] <expression2> }
                          | <expression1>

<expression1> ::= <conditional expression>

<conditional expression> ::=   { '(' <expression> ')' }  | <field reference name> <conditional operator> <value>  | <field reference name> [not] in '(' <value list> ')'

<value> ::= <number>
| <string>
| <datetime>

<value list> ::= <value> [ ',' <value list> ]

<conditional operator> ::=   { '=' | '<>' | '<' | '<=' | '>' | '>=' } 
                             | { [ever] [not] { like | under }} 

<field list> ::= <field name> [ ',' <field list> ]
<order by field list> ::= <field name> [ asc | desc ] [ ',' <order by field list> ]

<number> ::= [ '-' ] <digit>* [ '.' [ <digit>* ]] [ { e | E } [ '-' ] <digit>* ]

<string> ::=   { ''' { <anychar except '''> | '''' }* ''' } 
                 | { '"' { <anychar except '"'> | '""' }* '"' }

<datetime> ::= <string> Insert section body here.

Consulte também

Conceitos

Estendendo o acompanhamento de item de trabalho usando o modelo de objeto de cliente para o team foundation