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.
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.
|
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á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'
|
Relač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 |
Promě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. |
Literá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:
|
Režim |
Jeden z následujících:
|
|
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