문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문

버그, 작업 및 기타 작업 항목에 대한 쿼리

WorkItemStore.Query 메서드 중 하나 또는 Query 개체를 사용하여 버그, 작업, 기타 유형의 작업 항목, 작업 항목 간 링크를 쿼리할 수 있습니다. 이러한 쿼리는 Transact-SQL과 비슷한 작업 항목 쿼리 언어(WIQL)를 사용합니다.

// Connect to the work item store
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(
      new Uri("http://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);

항목 내용

필요한 권한

쿼리는 작업 항목 보기가 있는 작업 항목 또는 이 노드의 작업 항목 보기 사용 권한이 있는 작업 항목만 반환합니다. 일반적으로 이러한 권한은 각 팀 프로젝트에 대한 ReadersContributors 그룹의 구성원에게 부여됩니다. 자세한 내용은 Team Foundation Server에 대한 사용 권한 참조을 참조하십시오.

팁

작업 항목 쿼리 언어에 대한 세부 정보를 탐색하려면 팀 탐색기를 사용하여 쿼리를 만든 후 .wiql 파일로 저장합니다. 파일 이름을 변경하여 .xml 확장명을 사용하고 Visual Studio에서 엽니다. wiql 요소를 확인하여 작업 항목 쿼리 언어에 각 쿼리가 어떻게 표시되는지 확인합니다.

작업 항목 쿼리 언어는 다섯 부분으로 구성되어 있습니다.

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]

쿼리에서 반환하는 모든 WorkItem에서 값을 설정할 각각의 Field를 식별합니다. 필드의 참조 이름 또는 표시 이름을 지정할 수 있습니다. 이름에 공백 또는 기간이 포함되어 있는 경우에 대괄호([])를 사용해야 합니다.

주의 정보주의

쿼리에서 값을 반환하지 않은 경우에도 쿼리에서 반환한 WorkItem을 사용하여 Field 값을 얻을 수 있습니다. 이렇게 하면 서버에 한 번 더 왕복이 발생합니다. 자세한 내용은 성능 고려 사항을 참조하십시오.

From WorkItems

작업 항목을 찾는 쿼리를 원하는지 또는 작업 항목 간 링크를 찾는 쿼리를 원하는지를 나타냅니다.

From WorkItems

작업 항목에 사용합니다.

From WorkItemLinks

작업 항목 간 링크에 사용합니다. 자세한 내용은 작업 항목 간 링크에 대한 쿼리를 참조하십시오.

Where [Work Item Type] = 'User Story'

쿼리에 대한 필터 조건을 지정합니다. 자세한 내용은 이 항목의 뒷부분에 나오는 Where 절 구문을 참조하십시오.

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

(선택 사항) 쿼리가 반환하는 WorkItemCollection 정렬 방법을 지정합니다.

AsOf '6/15/2010'

(선택 사항) 필터가 적용될 날짜 또는 시간을 나타내어 기록 쿼리를 지정합니다. 예를 들어, 이 쿼리는 2010년 6월 15일에 존재했던 모든 사용자 스토리를 반환합니다.

참고참고

Visual Studio의 쿼리 작성기에서 AsOf 쿼리를 만들 수 없습니다. AsOf 절을 포함하는 쿼리 파일(.wiq)을 만든 다음 이 파일을 Visual Studio에 로드하는 경우 AsOf 절은 무시됩니다.

Where 절은 작업 항목 쿼리의 필터 조건을 지정합니다. 쿼리는 다음 조건을 만족하는 작업 항목만 반환합니다. 다음 예제 쿼리는 현재 활성화되어 있고 사용자에게 할당된 사용자 스토리를 반환합니다.

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

그룹 검색 조건에 괄호를 사용하면 논리 연산자가 평가되는 순서를 제어할 수 있습니다. 예를 들어, 사용자에게 할당되었거나 사용자가 종료한 작업 항목을 반환하려면 쿼리 필터를 다음 예제와 같이 변경합니다.

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

다음 표는 Where 절 구문을 설명합니다.

구문

예제

Where 절

Where FilterCondition [Group|{LogicalOperator FilterCondition}]

그룹

(FilterCondition LogicalOperator FilterCondition [LogicalOperator Filter Condition]…)

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

논리적 그룹화 연산자는 ANDOR입니다.

FilterCondition

Field ComparisonOperator Value

[Work Item Type] = ‘Help Topic’

필드의 참조 이름 또는 표시 이름을 지정할 수 있습니다. 이름에 공백이나 마침표가 있으면 대괄호([])로 묶어야 합니다.

비교 연산자는 이 항목의 뒷부분의 비교 연산자에 설명되어 있습니다.

리터럴 값('사용자 스토리') 또는 매크로(@Me)를 지정할 수 있습니다.

LiteralValue|Variable|Field

'User Story'

리터럴 값

필드의 값을 비교 하기 위한 실제 값 자세한 내용은 이 항목의 뒷부분의 리터럴 값을 참조하십시오.

변수

특정 값을 나타내는 식 예를 들어 @Me는 쿼리를 실행하는 사람을 나타냅니다. 자세한 내용은 이 항목의 뒤에 나오는 변수를 참조하십시오.

필드

다른 필드의 이름입니다. 예를 들어 [Assigned to] = [Changed by]를 사용하여 작업 항목을 할당 받은 사람 중 최근에 작업 항목을 변경한 사람을 찾을 수 있습니다.

다음 표에서 필드가 해당 값과 어떤 관계가 있어야 하는지 지정하기 위해 다음 표의 연산자를 사용할 수 있습니다.

쿼리 연산자

설명

필드의 해당 형식

=

값이 일치합니다.

숫자, 텍스트, 날짜, 트리

<>

값이 일치하지 않습니다.

숫자, 텍스트, 날짜, 트리

>

값보다 큽니다.

숫자, 텍스트, 날짜

<

값보다 작습니다.

숫자, 텍스트, 날짜

>=

값보다 크거나 같습니다.

숫자, 텍스트, 날짜

<=

값보다 작거나 같습니다.

숫자, 텍스트, 날짜

포함

문자열을 포함합니다.

Text

포함 안 함

문자열을 포함하지 않습니다.

Text

In

쉼표로 구분된 집합의 값과 일치합니다. 예를 들어, [System.Id] In (100, 101, 102)은 ID가 100, 101 및 102인 작업 항목을 찾습니다.

숫자, 텍스트, 날짜, 트리

그룹에 포함

그룹의 멤버입니다. 그룹은 Team Foundation 그룹([Assigned to] In Group [Project]\Contributors) 또는 작업 항목 형식 필드와 같이 사용할 경우 작업 항목 범주([Work Item Type] In Group Requirements)가 될 수 있습니다. 범주 그룹에 대한 자세한 내용은 범주를 사용하여 작업 항목 형식 그룹화를 참조하십시오.

Text

그룹에 포함되지 않음

그룹의 멤버가 아닙니다. 자세한 내용은 그룹에 포함 항목을 참조하십시오.

Text

할당된 적 있음

필드가 한 번이라도 값이 일치하는 경우(다른 값으로 변경된 경우 포함) 일치합니다.

텍스트, 날짜

다음에 속함

영역 및 반복에 대해, 작업 항목이 해당 노드 또는 해당 자식 노드 중 하나에 있는 경우 일치합니다. 영역 및 반복에 대한 내용은 영역 및 반복 경로 추가 및 수정을 참조하십시오.

트리

다음에 속하지 않음

영역 및 반복에 대해, 작업 항목이 해당 노드 또는 해당 자식 노드 중 하나에 없는 경우 일치합니다.

트리

쿼리의 변수를 사용하여 사용자 입력 또는 계산된 값을 전달할 수 있습니다. 변수를 포함하는 쿼리를 만들려면 @variable을 사용하여 쿼리 문자열에 자리 표시자를 만듭니다. 그런 다음 아래 예제와 같이 IDictionary의 구현을 사용하여 각 변수의 이름 및 값을 쿼리 메서드로 전달합니다.

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

사용자는 또한 해당 변수에 값을 입력하지 않고 쿼리에 @Me 또는 @Today를 사용할 수 있습니다. 쿼리에 이러한 변수가 표시되지만 IDictionary 구현에 전달된 관련 값이 없는 경우 변수는 다음 표의 설명에 따라 평가됩니다.

변수

용도

@Me

사용자 이름이 포함된 필드에 현재 사용자를 나타냅니다. 예를 들어, [Activated by] = @Me를 지정할 경우 사용자가 활성화한 작업 항목을 찾을 수 있습니다 .

@Today

현재 날짜를 나타냅니다. 일을 추가하거나 빼는 방식으로 @Today 변수를 수정할 수도 있습니다. 예를 들어, [Activated Date] > @Today - 7를 지정하는 경우 지난 주에 활성화되었던 모든 항목을 찾을 수 있습니다 .

각 필드에 대한 값을 지정할 경우 값이 해당 필드의 데이터 형식과 일치해야 합니다. Team Foundation의 모든 필드는 다음 표에 나열된 데이터 형식 중 하나여야 합니다.

데이터 형식

저장된 데이터

DateTime

SQL Server에 의해 정의된 datetime 기본적으로 작업 항목에 대한 쿼리에 있는 DateTime 값은 날짜 정밀도가 있는 것으로 취급됩니다. 예를 들어, 2010년 6월 1일 어떤 시간에 생성된 작업 항목은 필터 조건 [Created Date] = 6/1/2010과 일치합니다.

자세한 내용은 이 항목 뒷부분의 쿼리 메서드 및 쿼리 개체와 Microsoft 웹 사이트의 datetime(Transact-SQL) 페이지를 참조하세요.

Double

0.2, 3.5 등과 같은 실수입니다.

GUID

GUID를 나타내는 문자열입니다.

HTML

HTML을 포함하는 텍스트 문자열입니다.

Integer

0, 1, 2, 34 등 부호 있는 32비트 정수입니다.

PlainText

255자보다 클 수 있으며 서식이 없는 텍스트 문자열입니다.

문자열

최대 255자의 문자를 포함하는 텍스트 문자열입니다.

TreePath

영역 또는 반복 등의 분기 트리 구조입니다.

또한 작업 항목 간의 링크를 찾는 쿼리를 사용할 수 있습니다. Where 절의 조건은 링크에 적용하거나 소스 또는 링크 대상인 작업 항목에 적용할 수 있습니다. 다음 표는 이러한 유형의 쿼리와 작업 항목 전용 쿼리의 차이를 보여줍니다.

작업 항목

작업 항목 간 링크

원본 절

원본 WorkItems

원본 WorkItemLinks

Where 절

[FieldName] = Value

다음 중 하나:

[Source].[FieldName] = Value

[Target].[FieldName] = Value

[System.Links.LinkType] = 'LinkName'

모드

다음 중 하나:

mode(MustContain)

(기본값) 소스, 대상 및 링크 기준이 모두 충족되는 WorkItemLinkInfo 기록만 반환합니다.

mode(MayContain)

대상 기준을 충족하는 링크된 작업 항목이 없는 경우에도 소스 및 링크 기준을 충족하는 모든 작업 항목에 대해 WorkItemLinkInfo 기록을 반환합니다.

mode(DoesNotContain)

링크 및 대상 기준을 충족하는 링크된 작업 항목이 없는 경우에만 소스를 충족하는 모든 작업 항목에 대해 WorkItemLinkInfo 기록을 반환합니다.

반환 값

WorkItemCollection

WorkItemLinkInfo 배열입니다.

다음 쿼리는 사용자 스토리와 해당 활성 자식 노드 사이의 링크를 반환합니다.

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

WorkItemStore.Query 메서드를 사용하여 작업 항목을 쿼리할 수 있습니다. 또한 WorkItemStore.QueryCount 메서드를 사용하여 모든 작업 항목을 반환하지 않고 쿼리를 만족하는 작업 항목의 수를 식별할 수 있습니다.

Query 개체를 만들어 쿼리를 정의하고 실행할 수 있습니다.

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

Query.BeginQuery 메서드를 사용하여 쿼리를 비동기적으로 실행할 수 있습니다. 다음 샘플은 쿼리를 비동기적으로 실행하고 매우 짧은 제한 시간 후 쿼리를 취소합니다.

// 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."); 
}

쿼리가 반환하는 WorkItemCollection에는 다음 필드에 대한 값이 포함되어 있습니다.

  • ID

  • Rev(수정 버전)

  • AreaID

  • IterationID

  • WorkItemType

SELECT 절에 지정하는 필드 값은 페이지에 반환됩니다.

참고 참고

기본적으로 각 페이지에는 50개 작업 항목에 대해 선택된 필드가 포함되어 있습니다. 사용자는 WorkItemCollection.PageSize를 사용하여 페이지의 크기를 조정할 수 있습니다.

코드가 사용할 모든 필드를 선택하여 서버 왕복 횟수를 최소화할 수 있습니다. 다음 코드는 새 페이지에 액세스할 때마다 쿼리를 위해 한 번 왕복하고 제목 페이지를 반환하기 위해 한 번 왕복합니다.

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

코드가 SELECT 절에서 지정하지 않은 필드를 액세스할 경우 해당 필드는 페이지 필드 집합에 추가됩니다. 한 번 더 왕복을 수행하여 해당 페이지를 새로 고치고 해당 필드의 값을 포함합니다.

EBNF(확장된 Backus Naur 폼)는 간략하고 모호하지 않은 방법으로 언어의 문법을 설명하는 메타 언어입니다. 이 코드 블록은 EBNF를 사용하여 작업 항목 쿼리 언어(WIQL) 문법을 설명합니다.

EBNF에 익숙하지 않은 경우 Syntax for the Work Item Query Language에서 WIQL에 대한 대체 설명을 참조하십시오.

<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.
표시: