2012-02-13 20 views
37

Estoy tratando de consultar un único proyecto de equipo en el principal TfsTeamProjectCollection que contiene 194 proyectos de equipo en total. Sé exactamente cómo obtener un WorkItem por Id desde WorkItemStore. El hecho es que al hacer esto, la API busca en ALL de los proyectos en la colección y la consulta tarda aproximadamente un minuto. Esto es demasiado lento, debe haber una manera de consultar los elementos de trabajo directamente desde un único proyecto de equipo? Aquí está el código que tengo:TFS API - Cómo recuperar elementos de trabajo de Team Project específico

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; 
    } 

Ahora que tengo el proyecto de equipo que me interesa, ¿cómo puedo consultar los elementos de trabajo por ID o simplemente obtener todos los elementos de trabajo en este proyecto?

+0

FYI, deshacerse de ese bloque try/catch. No hace nada. –

+0

solía capturar una excepción de nullpointe porque el método tomaría una identificación de proyecto como parámetro, pero lo cambié. –

+1

Todo lo que hizo fue volver a lanzar la excepción, que es lo mismo que no captarla en absoluto. Tampoco debería capturar NullReferenceException, ya que siempre significa un error de programación. –

Respuesta

15

Probablemente sea más eficiente que use a query to find the workitems lo que le interese. Puede agregar un proyecto Where = '@Project' a la consulta para limitar el alcance a solo ese proyecto. Al llamar primero a BeginQuery y luego a EndQuery, obtendrá una colección de elementos de trabajo solo para los artículos que estaba buscando.

La manera más fácil de obtener la consulta wql requerida es crear una consulta en Team Explorer, luego use file-> save as (en modo edición) para guardarla en el archivo. Abra ese archivo en el Bloc de notas para copiar la consulta de allí.

Como alternativa, puede usar el WorkItemStore.Query method directamente para lograr lo mismo.

+3

El guardado de la consulta wql es una sugerencia brillante. Es mucho más fácil hacer su consulta correcta con la GUI de Team Explorer. Me has ahorrado horas de juego :-) – DaveF

34

Usted podría intentar algo como esto para conseguir todas las SOF dentro 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]"); 

Y esto para obtener una identificación WorkItem específica:

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

¿Sabes qué referencia agregar al proyecto para que se reconozca la consulta? Porque ya estoy usando 'Microsoft.TeamFoundation.Client' y' Microsoft.TeamFoundation.WorkItemTracking.Client' y obtengo errores para todo en el parámetro de 'workItemStore.Query()' –

+0

+1 para esta respuesta si puedes ayudar :) –

+0

No importa, funciona ... Gracias –

Cuestiones relacionadas