2012-02-13 1 views
37

Я пытаюсь запросить один командный проект в основном TfsTeamProjectCollection, который содержит 194 проектов команды в целом. Я точно знаю, как получить WorkItem по идентификатору от WorkItemStore. Дело в том, что, выполняя это, API ищет в ВСЕ проектов в коллекции и запрос занимает около минуты. Это слишком медленно, должен быть способ запросить рабочие элементы непосредственно из одного командного проекта? Вот код, у меня есть:TFS API - Как получить рабочие элементы из определенного Team Project

private Uri collectionUri; 
    private TfsTeamProjectCollection projectCollection; 
    private WorkItemStore workItemStore; 

    public Project GetTeamProject() 
    { 
     projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(collectionUri); 

     workItemStore = projectCollection.GetService<WorkItemStore>(); 
     Project teamProject = workItemStore.Projects[TFS_PROJECT_KEY]; 
     return teamProject; 
    } 

Теперь, когда у меня есть проект Team Я заинтересован в том, как я могу запросить рабочие элементы по идентификатору или просто получить все элементы работы в этом проекте?

+0

FYI, избавиться от Try/блока поймать. Он ничего не делает. –

+0

он использовал, чтобы поймать nullpointerexception, потому что метод использовал бы идентификатор проекта как параметр, но я его изменил. –

+1

Все, что вы сделали, это перестроить исключение, которое не совпадает с его отсутствием. Вы также никогда не должны ломать NullReferenceException, поскольку это всегда означает ошибку программирования. –

ответ

15

Это, вероятно, наиболее эффективно для интересующего вас use a query to find the workitems. В запрос можно добавить проект Where = '@Project', чтобы ограничить область только этим проектом. Сначала позвонив в BeginQuery, а затем в EndQuery вы получите коллекцию workitem только для предметов, которые вы искали.

Самый простой способ получить требуемый запрос wql - создать запрос в Team Explorer, а затем использовать file-> save as (в режиме редактирования), чтобы сохранить его в файле. Откройте этот файл в Блокноте, чтобы скопировать запрос оттуда.

В качестве альтернативы вы можете использовать WorkItemStore.Query method непосредственно для достижения той же цели.

+3

Сохранение запроса wql - это блестящий совет. Гораздо проще получить правильный запрос с помощью графического интерфейса Team Explorer. Вы спасли мне много времени :-) – DaveF

34

Вы могли бы попробовать что-то вроде этого для получения всех И в teamProject:

WorkItemCollection workItemCollection = workItemStore.Query(
    " SELECT [System.Id], [System.WorkItemType],"+  
    " [System.State], [System.AssignedTo], [System.Title] "+ 
    " FROM WorkItems " + 
    " WHERE [System.TeamProject] = '" + teamProject.Name + 
    "' ORDER BY [System.WorkItemType], [System.Id]"); 

И это, чтобы получить конкретную WorkItem ID:

WorkItem workItem = workItemStore.GetWorkItem(555); 
+0

Знаете ли вы, какую ссылку добавить в проект для распознавания запроса? Поскольку я уже использую 'Microsoft.TeamFoundation.Client' и' Microsoft.TeamFoundation.WorkItemTracking.Client', и я получаю ошибки для всего в параметре 'workItemStore.Query()' –

+0

+1 для этого ответа, если вы можете помочь :) –

+0

Nevermind, он работает ... Спасибо –