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İ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.

Uyarı notuUyarı

Sorgu değeri getirmese bile, bir Field değeri almak için sorgu ile getirilen WorkItem kullanabilirsiniz.Bunu yaparsanız sunucuda başka bir gidiş dönüş oluşur.Daha fazla bilgi için bkz. Performans Değerlendirmeleri.

From WorkItems

İş öğeleri veya iş öğeleri arasındaki bağlantıları bulmak için sorgu isteyip istemediğinizi belirtir.

From WorkItems

Çalışma öğeleri için kullanın.

From WorkItemLinks

Çalışma öğeleri arasındaki bağlantılar için kullanın.Daha fazla bilgi için, bkz. İş Öğeleri Arasındaki Bağlantılar için Sorgular.

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.

[!NOT]

Visual Studio'da sorgu oluşturucuda AsOf sorguları oluşturamazsınız.AsOf yan tümcesi içeren bir sorgu dosyası (.wiq) oluşturursanız ve bunu Visual Studio'ya yüklerseniz AsOf yan tümcesi göz ardı edilir.

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'

Değişmez değer

Alanın değeriyle karşılaştırılacak gerçek değer.Daha fazla bilgi için bu konuda daha sonraki Değişmez Değerler bölümüne bakın.

Değişken

Belirli bir değeri gösteren ifade.Örneğin, @Me sorguyu çalıştıran kişiyi gösterir.Daha fazla bilgi için bu konuda daha sonra gelen Değişkenler bölümüne bakın.

Alan

Başka bir alanın adı.Örneğin, en son değiştiren kişiye atanan iş öğelerini bulmak için [Assigned to] = [Changed by] öğesini kullanabilirsiniz.

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:

[Source].[FieldName] = Value

[Target].[FieldName] = Value

[System.Links.LinkType] = 'LinkName'

Mod

Aşağıdakilerden biri:

mode(MustContain)

(Varsayılan) Yalnızca kaynak, hedef ve bağlantı ölçütlerinin karşılandığı WorkItemLinkInfo kayıtlarını döndürür.

mode(MayContain)

Bağlantılı hiçbir iş öğesi hedef ölçütleri karşılamasa da kaynak ve bağlantı ölçütlerini karşılayan tüm iş öğelerinin WorkItemLinkInfo kayıtlarını döndürür.

mode(DoesNotContain)

Yalnızca hiçbir bağlantılı iş öğesi bağlantı ve hedef ölçütlerini karşılamıyorsa kaynağı karşılayan tüm iş öğelerinin WorkItemLinkInfo kayıtlarını döndürür.

Döndürür

WorkItemCollection

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