Sdílet prostřednictvím


Dotaz pro chyby, úkoly a jiné pracovní položky

Chyby, můžete dotaz úkoly jiné typy pracovních položek a propojení mezi pracovní položky pomocí jednoho z WorkItemStore.Query metody nebo Query objektu.Tyto dotazy pomocí práce položky dotazovací jazyk (WIQL), který se podobá 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”)

V tomto tématu

Požadovaná oprávnění

Dotaz vrátí pouze pracovní položky, pro které máte pracovní položky zobrazení nebo Zobrazit položky práce v tomto uzlu oprávnění.Obvykle jsou tato oprávnění udělena členům čtenáři a Přispěvatelé skupiny pro každý projekt týmu.Další informace naleznete v tématu Team Foundation Oprávnění serveru.

Tip

Prozkoumat podrobnosti pracovní položku dotazovací jazyk, vytvořit dotazy pomocí Průzkumník týmových projektůa potom je uložit jako soubory .wiql.Přejmenujte soubory příponu XML a otevřít v aplikaci Visual Studio.Hledat wiql prvek zobrazit, jak je každý dotaz vyjádřené v dotazovací jazyk pracovní položky.

Jazyk dotazu

Pracovní položka dotazovací jazyk má pět částí.

          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]

Identifikuje každou Field jehož hodnota bude nastavena každé WorkItem je vrácené dotazem.Můžete určit zobrazovaný název nebo odkaz na název pole.Hranaté závorky ([]) je nutné použít, pokud název obsahuje mezery nebo tečky.

Poznámka k upozorněníUpozornění
Můžete použít WorkItem , se vrátil k získání hodnoty Field, i když dotaz nevrátil hodnotu.Pokud to uděláte, dojde k další výměna zpráv na serveru.Další informace naleznete v tématu Stránkování pole hodnot.

From WorkItems

Označuje, zda má dotaz najít pracovní položky nebo propojení mezi pracovní položky.

From WorkItems

Použití pracovních položek.

From WorkItemLinks

Slouží pro propojení mezi pracovní položky.Další informace naleznete v tématu Dotazy pro odkazy mezi pracovními položkami.

Where [Work Item Type] = 'User Story'

Určuje kritéria filtru dotazu.Další informace naleznete v části Where klauzule uvedeném dále v tomto tématu.

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

(Volitelné) Určuje způsob řazení WorkItemCollection , vrátí dotaz.

AsOf '6/15/2010'

(Volitelné) Určuje historické dotazu, označující datum nebo bod v čase filtr má být aplikován.Tento dotaz například vrátí všechny příběhy uživatelů, které existovaly 15. června 2010.

PoznámkaPoznámka
Dotazy AsOf nelze vytvořit v okně Tvůrce dotazu v aplikaci Visual Studio.Pokud vytvoříte soubor dotazu (.wiq), který obsahuje klauzuli AsOf a načíst, v aplikaci Visual Studio, AsOf klauzule bude ignorována.

Where klauzule

Where klauzule určuje kritéria filtru dotazu pro pracovní položky.Dotaz vrátí pouze pracovní položky, které splňují tyto podmínky.Následující dotaz například vrátí příběhy uživatelů aktivní a které jsou vám přiřazeny.

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

Můžete řídit pořadí vyhodnoceny logické operátory použití závorek skupinu kritérií hledání.Například vrátit pracovní položky, které jsou přiřazeny buď, nebo uzavřen, změňte filtr dotazu, aby odpovídaly následujícímu příkladu:

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

Následující tabulka popisuje syntaxe Where klauzule:

Syntaxe

Příklad

Pokud klauzule

Where FilterCondition [Group|{LogicalOperator FilterCondition}]

Skupiny

(FilterCondition LogicalOperator FilterCondition [LogicalOperator Filter Condition]…)

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

Logické seskupení operátory jsou AND a OR.

FilterCondition

Field ComparisonOperator Value

[Work Item Type] = ‘Help Topic’

Můžete zadat název odkazu nebo zobrazovaný název pole.Pokud název obsahuje mezery nebo tečky, je nutné je uzavřít do hranatých závorek ([]).

Relační operátory jsou popsány v Relační operátory dále v tomto tématu.

Hodnoty, můžete zadat hodnotu literálu (User Story) nebo makra (@Me).

Value

LiteralValue|Variable|Field

'User Story'

Hodnota literálu

Skutečná hodnota porovnat hodnotu pole.Další informace naleznete v části Literálové hodnoty uvedeném dále v tomto tématu.

Proměnná

Výraz, který označuje určitou hodnotu.Například @Me označuje osobu, která je spuštěn dotaz.Další informace naleznete v části Proměnné uvedeném dále v tomto tématu.

Pole

Název jiného pole.Například můžete použít [Assigned to] = [Changed by]najít pracovní položky, které jsou přiřazeny osobě, která nedávno změněna pracovní položky.

Bb130306.collapse_all(cs-cz,VS.110).gifRelační operátory

Operátory můžete v následující tabulce určete, jak musí týkat odpovídající hodnota pole:

Operátor dotazu

Description

Platné typy polí

=

Odpovídá hodnotě.

Číslo, Text, datum stromu

< >

Hodnota neodpovídá.

Číslo, Text, datum stromu

>

Je větší než hodnota.

Číslo, Text, datum

<

Je menší než hodnota.

Číslo, Text, datum

> =

Je větší než nebo rovna hodnotě.

Číslo, Text, datum

< =

Je menší nebo rovna hodnotě.

Číslo, Text, datum

Obsahuje

Obsahuje řetězec.

Text

Neobsahuje

Neobsahuje řetězec.

Text

V

Odpovídá jakékoli hodnoty sady oddělený čárkami.Například [System.Id] In (100, 101, 102) najde pracovní položky, jejichž ID jsou 100, 101 a 102.

Číslo, Text, datum stromu

Ve skupině

Je členem skupiny.Skupiny mohou být Team Foundation skupiny ([Assigned to] In Group [Project]\Contributors) nebo kategorie pracovních položek při použití s polem Typ položky práce ([Work Item Type] In Group Requirements).Informace o kategorii skupin, viz Definice kategorií k seskupení typů pracovních položek.

Text

Není ve skupině

Je členem skupiny.Další informace naleznete v tématu položky pro In Group.

Text

Byla někdy

Pokud někdy hodnota pole odpovídá, i v případě, že byla změněna na jinou hodnotu.

Text, datum

Ve skupinovém rámečku

Pro oblasti a iterací odpovídá Pokud pracovní položka je v uzlu nebo některý z jeho podřízených uzlů.Informace o oblastech a iterací, Vytvořit a upravit oblasti a iterací.

Strom

Není pod

Pro oblasti a iterací odpovídá Pokud pracovní položka není v daném uzlu nebo některý z jeho podřízených uzlů.

Strom

Bb130306.collapse_all(cs-cz,VS.110).gifProměnné

Předat vstup uživatele nebo vypočítané hodnoty můžete použít proměnné v dotazech.Vytvoření dotazu, který zahrnuje proměnné, vytvořit zástupné znaky v řetězci dotazu pomocí @variable.Potom předat název a hodnoty proměnných dotazu metoda pomocí implementace IDictionary, jak ukazuje následující příklad

// 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()

Můžete také použít @Me nebo @Today v dotazu bez zadání hodnoty těchto proměnných.Když tyto proměnné se zobrazí v dotazu, ale mít žádné přidružené hodnoty předané v IDictionary provádění proměnné jsou vyhodnoceny jako popisuje následující tabulka:

Proměnná

Použití

@Me

Označuje pole, který obsahuje uživatelská jména aktuálního uživatele.Můžete například vyhledat pracovní položky, které jsou aktivovány, pokud zadáte [Activated by] = @Me.

@Today

Označuje aktuální datum.Můžete také změnit @Today proměnné přičtením nebo odečtením dnů.Můžete například vyhledat všechny položky, které byly aktivovány v posledním týdnu, pokud zadáte [Activated Date] > @Today - 7.

Bb130306.collapse_all(cs-cz,VS.110).gifLiterálové hodnoty

Pokud zadáte hodnotu pro každé pole, musí odpovídat typu dat pole.Všechna pole v Team Foundation mít jeden z typů dat, které jsou uvedeny v následující tabulce:

Typ dat

Uložená data

Datum a čas

A datetime hodnoty podle SQL Server.Standardně jsou považovány hodnoty DateTime v dotazech pro pracovní položky s datem přesnost.Například pracovní položka vytvořená kdykoli den 1. června 2010 by kritériím filtru neodpovídají [Created Date] = 6/1/2010.

Další informace naleznete v Metody dotazu a dotaz objektu dále v tomto tématu a na následující stránce na webu společnosti Microsoft: datetime (Transact-SQL).

Double

Reálné číslo, například 0,2 nebo 3.5.

IDENTIFIKÁTOR GUID

Znakový řetězec, který představuje identifikátor GUID.

HTML

Textové řetězce, které obsahují HTML.

Integer

32Bitové celé číslo, který je podepsán jako 0, 1, 2 nebo 34.

Prostý text

Neformátovaný textový řetězec, který může být delší než 255 znaků.

Řetězec

Textový řetězec obsahující až 255 znaků.

TreePath

Větvení stromové struktury, jako je oblast nebo iterace.

Dotazy pro odkazy mezi pracovními položkami

Dotazy můžete také najít odkazy mezi pracovní položky.Podmínka v Where klauzule mohou použít odkazy nebo pracovní položky, které je zdroj nebo cíl odkazu.Následující tabulka shrnuje rozdíly mezi těmito typy dotazů a dotazy pouze pro pracovní položky:

Pracovní položky

Propojení mezi pracovní položky

Klauzule FROM

Z WorkItems

Z WorkItemLinks

Pokud klauzule

[FieldName] = Value

Jeden z následujících:

[Source].[FieldName] = Value

[Target].[FieldName] = Value

[System.Links.LinkType] = 'LinkName'

Režim

Jeden z následujících:

mode(MustContain)

(Výchozí) Vrátí pouze WorkItemLinkInfo záznamy, kde jsou splněny všechny zdroje, cíle a kritéria propojení.

mode(MayContain)

Vrátí WorkItemLinkInfo záznamy pro všechny pracovní položky, které splňují kritéria zdroje a propojit i v případě, že žádné propojené pracovní položky splňuje kritéria cíle.

mode(DoesNotContain)

Vrátí WorkItemLinkInfo záznamy pro všechny pracovní položky, které vyhovují zdroje, pouze Pokud žádné propojené pracovní položky splňuje kritéria odkaz a cíl.

Výsledek

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

Matice WorkItemLinkInfo.

Následující dotaz vrátí odkazy mezi příběhy uživatelů a jejich aktivní podřízené uzly.

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

Metody dotazu a dotaz objektu

Dotaz lze pro pracovní položky pomocí WorkItemStore.Query metoda.Můžete také určit počet pracovních položek, které vyhovují dotazu bez návratu pomocí všech pracovních položek WorkItemStore.QueryCount metoda.

Můžete vytvořit Query objekt definovat a spouštět dotazy.

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.")

Asynchronní dotazy

Dotazy lze spustit asynchronně pomocí Query.BeginQuery metoda.Následující ukázkový dotaz spuštěn asynchronně a zruší po velmi krátký časový limit dotazu.

// 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

Stránkování pole hodnot

WorkItemCollection , Vrátí dotaz obsahuje hodnoty pro následující pole:

  • ID

  • REV (revize)

  • AreaID

  • IterationID

  • WorkItemType

Na stránkách jsou vráceny hodnoty polí, které zadáte v klauzuli SELECT.

[!POZNÁMKA]

Každá stránka obsahuje vybraná pole 50 pracovních položek.Velikost stránky můžete upravit pomocí WorkItemCollection.PageSize.

Výběrem všech polí, které bude používat váš kód můžete minimalizovat výměnami zpráv na serveru.Následující kód vytvoří jeden odezvy pro dotaz a jeden round trip vrátit stránku titulů při každém přístupu k nové stránky.

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

Pokud váš kód přistupuje k poli, které jste nezadali v klauzuli SELECT, je sada stránkovaného polí do pole.Další výměna zpráv se provádí aktualizaci této stránky zahrnují hodnoty pole.

Syntaxe dotazu (EBNF)

Rozšířené Backusova Naurova formulář (EBNF) je meta jazyk, který popisuje gramatiky jazyky v kompaktní a jednoznačným způsobem.Tento blok kódu používá k popisu gramatiky pracovní položku dotazovací jazyk (WIQL) EBNF.

Pokud nejste obeznámeni s EBNF, viz alternativní popis WIQL v 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.

Viz také

Koncepty

Rozšíření pracovní položku sledování pomocí objektového modelu klient pro Team Foundation