Today I’ve got a question on how to get files that are associated with specific work item. The requirement behind that was to grab configuration, data and similar files that were associated to a specific change request, which was entered as a work item.
After quick binging and browsing of the Team Foundation Server SDK, I’ve got the sample below.

static void Main(string[] args) { using (TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer(args[0], new UICredentialsProvider())) { tfs.EnsureAuthenticated(); WorkItemStore wiStore = (WorkItemStore)tfs.GetService(typeof(WorkItemStore)); VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));

    int workItemId;
    if (int.TryParse(args\[1\], out workItemId))
    {
        WorkItem workItem = wiStore.GetWorkItem(workItemId);
        Console.WriteLine("Work item: {0}", workItem.Title);
        //We look for links associated with work item foreach (Link link in workItem.Links)
        {
            ExternalLink extLink = link as ExternalLink;
            if (extLink != null)
            {
                ArtifactId artifact = LinkingUtilities.DecodeUri(extLink.LinkedArtifactUri);
                //For this example I grab Changeset directly
                //however in the real scenario you could grab other related workitems
                //and this way parse entire tree up to the changeset if (String.Equals(artifact.ArtifactType, "Changeset", StringComparison.Ordinal))
                {
                    // Convert the artifact URI to Changeset object. Changeset cs = vcs.ArtifactProvider.GetChangeset(new Uri(extLink.LinkedArtifactUri));
                    foreach (Change change in cs.Changes)
                    {
                        //We want to download files only if (change.Item.ItemType == ItemType.File)
                        {
                            RetrieveFile(change);
                        }
                    }
                }
            }
        }
        Console.ReadLine();
    }
}

}

private static void RetrieveFile(Change change) { //Technically we should process the information //i.e. you should create separate folders according to the server location //to avoid the file overwriting //if folders are not present - those should be created string fileName = change.Item.ServerItem.Split(’/’).Last(); Console.WriteLine(“Item name: {0}. Last operation {1}”, fileName, change.ChangeType); change.Item.DownloadFile(@“C:MyProjectsVS10SolutionGetWIFilesttt” + fileName); }

Here go the credits: http://blogs.msdn.com/buckh/archive/2006/08/12/artifact_uri_to_changeset.aspx
A quick reminder to myself (and the others): TFS is VERY extensible. You can extend the processes, work items, reports, functionality, … just need the right tools