Hataları, Görevleri ve Diğer Çalışma Öğelerini Sorgulama
WorkItemStore.Query yöntemlerinden birini veya Query nesnesini kullanarak, hatalar, görevler, diğer iş öğesi türleri ve iş öğeleri arasındaki bağlantılar için sorgu oluşturabilirsiniz.Bu sorgular, Transact-SQL'e benzeyen iş öğesi sorgu dilini (WIQL) kullanır.
// Connect to the work item store
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(
new Uri("https://server:8080/tfs/DefaultCollection"));
WorkItemStore workItemStore = (WorkItemStore)tpc.GetService(typeof(WorkItemStore));
// Run a query.
WorkItemCollection queryResults = workItemStore.Query(
"Select [State], [Title] " +
"From WorkItems " +
"Where [Work Item Type] = 'User Story' " +
"Order By [State] Asc, [Changed Date] Desc");
// Run a saved query.
QueryHierarchy queryRoot = workItemStore.Projects[0].QueryHierarchy;
QueryFolder folder = (QueryFolder) queryRoot["Shared Queries"];
QueryDefinition query = (QueryDefinition)folder["Active Bugs"];
queryResults = workItemStore.Query(query.QueryText);
‘ Connect to the work item store
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)()
‘ Run a query.
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")
‘ Run a saved query.
Dim queryRoot As QueryHierarchy
queryRoot = workItemStore.Projects[0].QueryHierarchy
Dim folder As QueryFolder
folder = (QueryFolder) queryRoot["Shared Queries"]
Dim query As QueryDefinition
query = (QueryDefinition)folder["Active Bugs"]
queryResults = workItemStore.Query(query.QueryText)
Bu konuda
Gerekli İzinler
Sorgu yalnızca İş öğelerini görüntüle veya Bu düğümdeki iş öğelerini görüntüle izninizin olduğu çalışma öğelerini döndürür.Genellikle, bu izinler her bir takım projesi için Okuyucular ve Katkıda bulunanlar gruplarına verilir.Daha fazla bilgi için bkz. Team Foundation Server izinleri.
İpucu |
---|
İş öğesi sorgu dili ayrıntılarını incelemek için Ekip Gezgini kullanarak sorgular oluşturun ve .wiql dosyaları olarak kaydedin.Dosyaları .xml uzantısını kullanacak şekilde yeniden adlandırın ve bunları Visual Studio'da açın.İş öğesi sorgu dilinde her sorgunun nasıl ifade edildiğini görmek için wiql öğesini arayın. |
Sorgu Dili
İş öğesi sorgu dili beş bölümden oluşur.
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] |
Değeri, sorgu tarafından döndürülen her WorkItem öğesinde ayarlanan her bir Field öğesini tanımlar.Alanın başvuru adını veya görüntülenen adını belirtebilirsiniz.Adda boşluk ya da noktalar varsa, köşeli ayraçlar ([]) kullanmanız gerekir.
|
||
From WorkItems |
İş öğeleri veya iş öğeleri arasındaki bağlantıları bulmak için sorgu isteyip istemediğinizi belirtir.
|
||
Where [Work Item Type] = 'User Story' |
Sorgunun filtre ölçütünü belirtir.Daha fazla bilgi için daha sonra bu konudakiWhere Yan Tümcesinin Sözdizimi başlığına bakın. |
||
Order By [State] Asc, [Changed Date] Desc |
(İsteğe bağlı) Sorgunun döndüğü WorkItemCollection öğesinin nasıl sıralanacağını belirtir. |
||
AsOf '6/15/2010' |
(İsteğe bağlı) Zamanda filtre uygulanacak bir an veya tarih göstererek geçmiş bir sorguyu belirtir.Örneğin, bu sorgu 15 Haziran 2010 tarihinde var olan tüm kullanıcı hikayelerini döndürür.
|
Where Yan Tümcesi
Where yan tümcesi, çalışma öğeleri için bir sorgunun filtre kriterlerini belirtir.Sorgu sadece bu koşulları karşılayan çalışma nesnelerini geri döndürür.Aşağıdaki örnek sorgu aktif olan ve size atanan kullanıcı hikayelerini geri döndürür.
Where [Work Item Type] = 'User Story'
AND [State] = ‘Active’
AND [Assigned to] = @Me
Arama ölçütlerini gruplandırmak için parantez kullanırsanız, mantıksal işleçlerin değerlendirilme sırasını denetleyebilirsiniz.Örneğin, size atanan veya sizin kapattığınız iş öğelerini döndürmek için, sorgu filtresini aşağıdaki örnekle eşleşecek şekilde değiştirin:
Where [Work Item Type] = 'User Story'
AND [State] = ‘Active’
AND ( [Assigned to] = @Me
OR [Closed by] = @Me )
Aşağıdaki tablo Where yan tümcesinin sözdizimini açıklamaktadır:
Sözdizimi |
Örnek |
|
---|---|---|
Where yan tümcesi |
Where FilterCondition [Group|{LogicalOperator FilterCondition}] |
|
Grup |
(FilterCondition LogicalOperator FilterCondition [LogicalOperator Filter Condition]…) |
([Assigned to] = @Me OR [Created by = @Me]) Mantıksal gruplama işleçleriAND ve OR. |
FilterCondition |
Field ComparisonOperator Value |
[Work Item Type] = ‘Help Topic’ Bir alanın görüntülenen adını veya başvuru adını belirtebilirsiniz.Adda boşluk ya da nokta varsa, bunu köşeli ayraç ([]) içine almalısınız. Karşılaştırma işleçleri, daha sonra bu konuda Karşılaştırma İşleçleri'nde açıklanmaktadır. Değer için hazır değer ('Kullanıcı Hikayesi') veya bir makro (@Me) kullanabilirsiniz. |
Değer |
LiteralValue|Variable|Field |
'User Story'
|
Karşılaştırma İşleçleri
Bir alanın, karşılık gelen değerle nasıl ilişkilendirilmesi gerektiğini belirtmek için, aşağıdaki tablodaki işleçleri kullanabilirsiniz:
Sorgu işleci |
Açıklama |
Uygun alan türleri |
---|---|---|
= |
Değeri eşleştirir. |
Sayı, Metin, Tarih, Ağaç |
<> |
Değerle eşleşmiyor. |
Sayı, Metin, Tarih, Ağaç |
> |
Değerden büyük. |
Sayı, Metin, Tarih |
< |
Değerden küçük. |
Sayı, Metin, Tarih |
>= |
Değerden büyük veya değere eşit. |
Sayı, Metin, Tarih |
<= |
Değerden küçük veya değere eşit. |
Sayı, Metin, Tarih |
İçerir |
Dizeyi içerir. |
Metin |
İçermez |
Dizeyi içermiyor. |
Metin |
İçindeki |
Virgülle ayrılmış kümedeki herhangi bir değeri eşler.Örneğin, [System.Id] In (100, 101, 102) kimlikleri 100, 101 ve 102 olan iş öğelerini bulur. |
Sayı, Metin, Tarih, Ağaç |
Grup İçi |
Grubun üyesi.Grup olabilir bir Team Foundation grubu ([Assigned to] In Group [Project]\Contributors) veya iş öğesi türü alanıyla kullandığınızda bir iş öğesi kategori ([Work Item Type] In Group Requirements).Kategori grupları hakkında bilgi için bkz. İş öğesi türlerini gruplamak için kategorileri kullanma. |
Metin |
Grupta Değil |
Grubun üyesi değil.Daha fazla bilgi için bkz. Grupta girişi. |
Metin |
Her Zaman |
Alan önceden değeri karşılarsa, hatta farklı bir değere taşınmışsa bile eşleştirir. |
Metin, Tarih |
Altında |
Alanlar ve yinelemeler için iş öğesi o düğümdeyse veya alt düğümlerinden biriyse eşleşir.Alanlar ve yinelemeler hakkında bilgi için bkz. Alan ve yineleme yolları ekleme ve değiştirme. |
Ağaç |
Altında Değil |
Alanlar ve yinelemeler için iş öğesi o düğümde değilse veya alt düğümlerinden birinde değilse eşleşir. |
Ağaç |
Değişkenler
Sorgularınızdaki değişkenleri, kullanıcı girişini veya hesaplanan değerleri geçirmek için kullanabilirsiniz.Değişkenleri içeren bir sorgu oluşturmak için @variable kullanarak, sorgu dizesinde yer tutucular oluşturun.Sonra adı ve her değişkenin değerini sorgu yöntemine, aşağıdaki örnekte gösterildiği gibi bir IDictionary uygulaması kullanarak geçirin.
// 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()
Ayrıca, sorgunuzda, bu değişkenler için değerler sağlamadan @Me veya @Today kullanabilirsiniz.Bu değişkenler sorguda görüldüğünde ancak IDictionary uygulamasında geçirilen ilişkili değere sahip olmadığında değişkenler, aşağıdaki tabloda açıklandığı gibi değerlendirilir:
Değişken |
Kullanım |
---|---|
@Me |
Kullanıcı ayarlarının bilindiği alanda geçerli kullanıcıyı belirtir.Örneğin, [Activated by] = @Me öğesini belirtirseniz etkinleştirdiğiniz iş öğelerini bulabilirsiniz. |
@Today |
Geçerli tarihi belirtir.Ayrıca @Today değişkenini, günleri çıkararak veya ekleyerek değiştirebilirsiniz.Örneğin, [Activated Date] > @Today - 7 tarihini belirtirseniz, geçen hafta etkinleştirilen tüm öğeleri bulabilirsiniz. |
Değişmez Değerler
Her bir alan için bir değer belirtirseniz, değer alanın değer türü ile eşleşmelidir.Team Foundation içindeki tüm alanlarda aşağıdaki tabloda listelenen veri türlerinden biri vardır:
Veri türü |
Depolanan veri |
---|---|
DateTime |
SQL Server tarafından tanımlandığı gibi datetime değeri.Varsayılan olarak, iş öğeleri için DateTime değerlerine, tarih duyarlılığı varmış gibi davranılır.Örneğin, 1 Haziran 2010 günü herhangi bir zamanda oluşturulmuş bir iş öğesi [Created Date] = 6/1/2010 filtre ölçütüyle eşleşir. Daha fazla bilgi için sorgu yöntemlerini ve sorgu nesnesi daha sonra bu konu ve şu sayfa Microsoft Web sitesinde: datetime (Transact-SQL). |
Çift |
0,2 veya 3,5 gibi gerçek bir sayı. |
GUID |
GUID'i temsil eden bir karakter dizesi. |
HTML |
HTML içeren metin dizeleri. |
Tamsayı |
0, 1, 2 veya 34 gibi işaretli 32 bitlik bir tamsayı. |
PlainText |
255 karakterden uzun olabilen biçimlendirilmemiş metin dizesi. |
Dize |
En fazla 255 karakter içeren bir metin dizesi. |
TreePath |
Alan veya Yineleme gibi dallanan bir ağaç yapısı. |
Çalışma Öğeleri Arasındaki Bağlantılar için Sorgular
Çalışma öğeleri arasında bağlantılar bulmak için sorguları da kullanabilirsiniz.Where yan tümcesindeki bir koşul bağlantılara veya bir bağlantının hedefi veya kaynağı olan bir işe uygulanabilir.Aşağıdaki tablo sorgu türleri ve sadece çalışma nesnelerine yönelik sorgular arasındaki farkları özetlemektedir:
İş öğeleri |
Çalışma öğeleri arasındaki bağlantılar |
|
---|---|---|
From yan tümcesi |
WorkItems öğesinden |
WorkItemLinks öğesinden |
Where yan tümcesi |
[FieldName] = Value |
Aşağıdakilerden biri:
|
Mod |
Aşağıdakilerden biri:
|
|
Döndürür |
WorkItemLinkInfo dizisi. |
Aşağıdaki sorgu kullanıcı hikayeleri ve etkin alt düğümleri arasındaki bağlantıları geri döndürür.
SELECT [System.Id]
FROM WorkItemLinks
WHERE ([Source].[System.WorkItemType] = 'User Story')
And ([System.Links.LinkType] = 'Child')
And ([Target].[System.State] = 'Active')
mode(MustContain)
Sorgu Yöntemleri ve Sorgu Nesnesi
WorkItemStore.Query yöntemini kullanarak çalışma öğeleri için sorgu yapabilirsiniz.WorkItemStore.QueryCount yöntemini kullanarak, tüm çalışma öğelerini geri getirmeden, bir sorguyu karşılayan çalışma öğesi sayısını belirleyebilirsiniz.
Sorguları tanımlamak ve çalıştırmak için bir Query nesnesi oluşturabilirsiniz.
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.")
Zaman Uyumsuz Sorgular
Query.BeginQuery yöntemini kullanarak sorguları zaman uyumsuz olarak çalıştırabilirsiniz.Aşağıdaki örnek zaman uyumsuz olarak bir sorgu çalıştırır ve çok kısa bir zaman aşımı sonunda sorguyu iptal eder.
// 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
Alan Değerlerini Sayfalama
Bir sorgunun döndürdüğü WorkItemCollection, aşağıdaki alanlar için değerler içerir:
Kimlik
Rev (Düzeltme)
AreaID
IterationID
WorkItemType
SELECT yan tümcesinde belirttiğiniz alanların değerleri sayfalarda getirilir.
[!NOT]
Varsayılan olarak, her sayfa 50 iş öğesi için seçili alanları içerir.WorkItemCollection.PageSize kullanarak bir sayfanın boyutunu ayarlayabilirsiniz.
Kodunuzun kullanacağı tüm alanları seçerek sunucuya gidiş gelişleri en aza indirgeyebilirsiniz.Aşağıdaki kod her seferinde yeni bir sayfaya erişildiğinde sorgu için bir gidiş dönüş, dönen sayfaların başlıkları için ise bir gidiş dönüş gerçekleştirir.
WorkItemCollection results = WorkItemStore.Query(
"SELECT Title FROM Workitems WHERE (ID < 1000)");
foreach (WorkItem item in results)
{
Console.WriteLine(item.Fields["Title"].Value);
}
Kodunuz SELECT yan tümcesinde belirtmediğiniz bir alana erişirse, o alan disk belleği alanları kümesine eklenir.Bu alanın değerlerini içermek için bu sayfayı yenilemek amacıyla bir başka gidiş dönüş gerçekleştirilir.
Sorgu Sözdizimi (EBNF)
Genişletilmiş Backus-Naur Form (EBNF), dillerin dilbilgisini kompakt ve benzersiz bir şekilde tanımlayan bir meta dildir.Bu kod bloğu, iş öğesi sorgulama dilinin (WIQL) dilbilgisini açıklamak için EBNF kullanır.
EBNF'ye alışkın değilseniz, Syntax for the Work Item Query Language konusunda farklı bir WIQL açıklamasına bakın.
<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.
Ayrıca bkz.
Kavramlar
Team Foundation için İstemci Nesne Modelini Kullanarak İş Öğesi İzlemeyi Genişletme