Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сервисы Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022
Используйте аналитические OData-запросы для получения данных отслеживания работы из Azure DevOps в браузере или таких клиентских приложениях, как Excel и Power BI. В этой статье рассматриваются подсчет элементов, выбор определенных полей с $select, фильтрация с $filter, расширение свойств навигации с $expand, запрос диапазонов дат и сортировка с $orderby.
Подсказка
Вы можете использовать ИИ, чтобы помочь с этой задачей далее в этой статье или см. включение ИИ-помощи с помощью Azure DevOps MCP Server, чтобы приступить к работе.
В примерах рассматриваются наборы сущностей отслеживания работы в Azure Boards, но те же принципы применяются к другим наборам сущностей. Дополнительные сведения см. в статьях Конструирование запросов OData для аналитики и Справочник по метаданным для аналитики Azure Boards.
Примечание.
Служба Аналитики автоматически включается и поддерживается в рабочей среде для всех служб в Azure DevOps Services. Интеграция Power BI и доступ к веб-каналу OData службы Аналитики общедоступны. Рекомендуется использовать веб-канал OData аналитики и предоставить отзыв.
Доступные данные зависят от версий. Последняя поддерживаемая версия API OData - v2.0, а последняя предварительная версия - v4.0-preview. Дополнительные сведения см. в разделе "Управление версиями API OData".
Примечание.
Служба Аналитики автоматически устанавливается и поддерживается в рабочей среде для всех новых коллекций проектов для Azure DevOps Server 2020 и более поздних версий. Интеграция Power BI и доступ к веб-каналу OData службы Аналитики общедоступны. Рекомендуется использовать веб-канал OData аналитики и предоставить отзыв. При обновлении с Azure DevOps Server 2019 можно установить службу Аналитики во время обновления.
Доступные данные зависят от версий. Последняя поддерживаемая версия API OData - v2.0, а последняя предварительная версия - v4.0-preview. Дополнительные сведения см. в разделе "Управление версиями API OData".
Предварительные условия
| Категория | Требования |
|---|---|
| Уровни доступа |
-
член проекта. — Как минимум базовый доступ . |
| Права доступа | По умолчанию члены проекта имеют разрешение выполнять запросы к аналитике и создавать представления. Дополнительные сведения о других предварительных требованиях для включения служб и функций и общих действий отслеживания данных см. в разделе "Разрешения и предварительные требования для доступа к аналитике". |
Примечание.
- Запросы между проектами завершаются сбоем, если пользователь, выполняющий запрос, не имеет доступа ко всем проектам. Дополнительные сведения см. в разделе "Запросы в области проекта и организации".
- Примеры, приведенные в этой статье, используют формат URL-адреса Azure DevOps Services:
https://analytics.dev.azure.com/{OrganizationName}/Вместо этого используйтеhttps://{servername}/{CollectionName}/для Azure DevOps Server. Дополнительные сведения см. в разделе "Создание запросов OData для аналитики".
Узнать количество элементов
Чтобы вернуть только количество без других данных, добавьте $apply=aggregate($count as Count) к URL-адресу набора сущностей. Например, следующие запросы подсчитывают проекты, рабочие элементы, пути к областям и пользователей в организации.
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/Projects?$apply=aggregate($count as Count)
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/WorkItems?$apply=aggregate($count as Count)
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/Areas?$apply=aggregate($count as Count)
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/Users?$apply=aggregate($count as Count)
Запрос Projects для fabrikam организации возвращает:
{
"value": [
{
"Count": 16
}
]
}
Получение количества элементов и их данных
Чтобы вернуть количество вместе с данными, добавьте $count=true в запрос с ключевым словом $select. Следующие запросы возвращают количество и выбранные свойства для рабочих элементов, путей к областям и пользователей в проекте:
https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/v4.0-preview/WorkItems?$count=true&$select=WorkItemId,Title,WorkItemType
https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/v4.0-preview/Areas?$count=true&$select=AreaName,AreaPath
https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/v4.0-preview/Users?$count=true&$select=UserName,UserEmail
Примечание.
Всегда включайте $select и $apply в ваш запрос. Пропуск обоих параметров вызывает предупреждение и может привести к превышению лимитов использования.
Допустимые имена свойств см. в справочнике по метаданным Azure Boards Analytics и справочнике по метаданным даты календаря, проекта и пользователя.
Например, следующий запрос возвращает количество и имена пользователей в проекте Fabrikam Fiber:
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/Users?$count=true&$select=UserName
Ответ включает общее количество записей @odata.count и соответствующие записи в value:
{
"@odata.count": 5,
"value": [
{ "UserName": "Microsoft.VisualStudio.Services.TFS" },
{ "UserName": "fabrikamfiber1@hotmail.com" },
{ "UserName": "Jamal Hartnett" },
{ "UserName": "fabrikamfiber5@hotmail.com" },
{ "UserName": "fabrikamfiber2@hotmail.com" }
]
}
Выбор определенных свойств или полей
Добавьте оператор $select, чтобы вернуть только необходимые свойства. Имена свойств чувствительны к регистру, не могут содержать пробелы и должны соответствовать именам полей рабочих элементов. Например, $select=WorkItemId,WorkItemType,Title,State возвращает эти четыре поля.
Дополнительные сведения о поиске имен свойств, включая настраиваемые поля, см. в справочнике по метаданным для Azure Boards.
Следующий запрос возвращает идентификатор, тип, название и состояние для трех основных рабочих элементов в проекте Fabrikam Fibre:
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State&$top=3
{
"value": [
{ "WorkItemId": 31, "Title": "About screen", "WorkItemType": "Task", "State": "New" },
{ "WorkItemId": 30, "Title": "Change background color", "WorkItemType": "Task", "State": "Active" },
{ "WorkItemId": 32, "Title": "Standardize on form factors", "WorkItemType": "Task", "State": "Active" }
]
}
Фильтрация данных
$filter Добавьте предложение, чтобы возвращать только элементы, соответствующие определенным критериям. Используйте операторы сравнения, такие как eq, ne, gt, ge, lt, и le, и сочетайте условия с and и or. Например, следующий запрос возвращает функции, которые выполняются:
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,Title,AssignedTo,State&$filter=WorkItemType eq 'Feature' and State eq 'In Progress'
Объединение нескольких условий фильтра
Используйте круглые скобки для группирования or условий в более широком and фильтре. Следующий запрос возвращает пользовательские истории, ошибки и пользовательский тип в определенных состояниях:
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,Title,AssignedTo,State&$filter=(WorkItemType eq 'User Story' or WorkItemType eq 'Bug' or WorkItemType eq 'Backlog Work') and (State eq 'New' or State eq 'Committed' or State eq 'Active')
{
"value": [
{ "WorkItemId": 210, "Title": "Slow response on form", "State": "Active" },
...
{ "WorkItemId": 160, "Title": "Game store testing", "State": "New" }
]
}
Можно также использовать такие строковые функции, как contains, startswithи endswith в выражениях фильтра. Дополнительные сведения см. в разделе "Поддерживаемые функции".
Свойства пути области запроса или пути итерации
Для некоторых запросов требуется суррогатный ключ (AreaSK или IterationSK) вместо строки пути. Используйте наборы сущностей "Области " или " Итерации" , чтобы найти ключ для определенного пути.
Вернуть AreaSK для определенного пути к области
Следующий запрос возвращает AreaSK для пути области Fabrikam Fiber\Production Planning\Web. Сведения о других доступных свойствах см. в разделе "Области".
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/Areas?$filter=AreaPath eq 'Fabrikam Fiber\Production Planning\Web'&$select=AreaSK
{
"value": [
{ "AreaSK": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" }
]
}
Получите IterationSK для конкретного пути итерации
Следующий запрос возвращает IterationSK для Fabrikam Fiber\Release 1\Sprint 3 итерационного пути. Сведения о других доступных свойствах см. в разделе "Итерации".
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/Iterations?$filter=IterationPath eq 'Fabrikam Fiber\Release 1\Sprint 3'&$select=IterationSK
Фильтрация по свойствам навигации
Свойства навигации, такие как Iteration, Areaи AssignedTo представляют связи с другими сущностями. Чтобы отфильтровать поле из связанной сущности, используйте полный путь в формате NavigationProperty/Field. Например, Iteration/IterationPath ссылается на IterationPath поле с помощью свойства навигации Iteration :
/WorkItems?$filter=Iteration/IterationPath eq 'Project Name\Iteration 1'
Следующий запрос возвращает первые пять рабочих элементов в определенной итерации, используя полный путь навигации:
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$top=5&$filter=Iteration/IterationPath eq 'Fabrikam Fiber\3Week Sprints\Sprint 3'&$select=WorkItemId,WorkItemType,Title,State&$orderby=WorkItemId asc
Разверните данные из связанных сущностей
Фильтрация по навигационному свойству означает, что его данные не будут включены в ответ. Чтобы вернуть поля из связанной сущности, используйте $expand. Без $expand невозможен доступ к полям свойств навигации через $select.
Следующий запрос возвращает рабочий элемент 480 со всеми полями из развернутой Iteration сущности:
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration
Так как $select не применяется к расширению Iteration, ответ включает каждое Iteration поле:
{
"value": [
{
"WorkItemId": 480,
"Title": "Add animated emoticons",
"WorkItemType": "User Story",
"State": "New",
"Iteration": {
"ProjectSK": "bbbbbbbb-1111-2222-3333-cccccccccccc",
"IterationSK": "cccccccc-2222-3333-4444-dddddddddddd",
"IterationName": "Sprint 3",
"IterationPath": "Fabrikam Fiber\\3Week Sprints\\Sprint 3",
"StartDate": "2025-12-04T00:00:00-12:00",
"EndDate": "2025-12-25T23:59:59.999-12:00",
"IterationLevel1": "Fabrikam Fiber",
"IterationLevel2": "3Week Sprints",
"IterationLevel3": "Sprint 3",
...
"Depth": 2,
"IsEnded": false
}
}
]
}
Используйте select в операторах расширения
Чтобы ограничить поля, возвращаемые из развернутой сущности, добавьте $select условие внутри $expand с использованием синтаксиса $expand=Entity($select=Field1,Field2). Следующий запрос расширяет Iteration, возвращает только IterationName и IterationPath:
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration($select=IterationName,IterationPath)
{
"value": [
{
"WorkItemId": 480,
"Title": "Add animated emoticons",
"WorkItemType": "User Story",
"State": "New",
"Iteration": {
"IterationName": "Sprint 3",
"IterationPath": "Fabrikam Fiber\\3Week Sprints\\Sprint 3"
}
}
]
}
В следующей таблице показаны $expand$select примеры распространенных типов свойств навигации:
| Тип навигации | Основное свойство | Примеры положений |
|---|---|---|
| Дата/время | DateSK |
$expand=CreatedDate($select=Date) или$expand=CreatedDate($select=WeekStartingDate) |
| Идентификация | UserSK |
$expand=AssignedTo($select=UserName) или$expand=AssignedTo($select=UserEmail) |
| Площадь | AreaSK |
$expand=Area($select=AreaName) или$expand=Area($select=AreaPath) |
| Итерация | IterationSK |
$expand=Iteration($select=IterationName) или$expand=Iteration($select=IterationPath) или$expand=Iteration($select=StartDate) |
| Проект | ProjectSK |
$expand=Project($select=ProjectName) |
| Группа | TeamSK |
$expand=Teams($select=TeamName) |
Чтобы развернуть несколько свойств навигации в одном запросе, используйте список с разделителями-запятыми:
$expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath)
Использование вложенных инструкций развертывания
Чтобы развернуть свойство навигации в уже развернутой сущности, вложите один $expand в другой. Следующий запрос разворачивает Iteration, а затем расширяет Project внутри Iteration, чтобы показать, к какому проекту принадлежит итерация.
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration($expand=Project)
Для комбинирования вложенного расширения с $select, используйте точку с запятой (;) для разделения $select от $expand внутри круглых скобок. Без запятой запрос возвращает ошибку. Следующий запрос возвращает только IterationName и IterationPath из Iteration, а также вложенный Project:
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration($select=IterationName,IterationPath;$expand=Project)
{
"value": [
{
"WorkItemId": 480,
"Title": "Add animated emoticons",
"WorkItemType": "User Story",
"State": "New",
"Iteration": {
"IterationName": "Sprint 3",
"IterationPath": "Fabrikam Fiber\\3Week Sprints\\Sprint 3",
"Project": {
"ProjectSK": "bbbbbbbb-1111-2222-3333-cccccccccccc",
"ProjectName": "Fabrikam Fiber"
}
}
}
]
}
Запрос диапазона дат
В следующем примере запроса возвращаются рабочие элементы, последняя дата изменения которых больше или равно 1 января 2025 года.
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State&$filter=ChangedDate ge 2025-01-01Z
В следующем примере запроса возвращаются рабочие элементы, последние дата изменения которых произошла в течение недели с 31 октября по 7 ноября 2025 года.
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State&$filter=ChangedDate ge 2025-10-31Z and ChangedDate le 2025-11-07Z
Сортировка результатов
Добавьте $orderby для сортировки результатов по одному или нескольким свойствам. Результаты сортируются по возрастанию по умолчанию; для убывания добавьте desc. Разделите несколько полей сортировки запятыми.
| Сортировать по | Статья |
|---|---|
| Идентификатор рабочего элемента | /WorkItems?$orderby=WorkItemId |
| Идентификатор рабочего элемента (самый новый) | /WorkItems?$orderby=WorkItemId desc |
| Тип рабочего элемента, а затем состояние | /WorkItems?$orderby=WorkItemType,State |
Использование ИИ для создания запросов OData
Если вы настроите сервер MCP Azure DevOps, вы можете использовать помощники по искусственному интеллекту для создания и устранения неполадок запросов OData.
Примеры подсказок
| задачи | Пример запроса |
|---|---|
| Создание запроса | Write an OData query that returns all active bugs with their area path and assigned-to fields in <Contoso> project |
| Фильтрация по дате | Create an OData query that returns work items created in the last 30 days in <Contoso> project |
| Разверните свойства навигации | Write an OData query that expands the iteration path and area path for user stories in <Contoso> project |
| Отладка запроса | My OData query returns no results — help me troubleshoot the filter clause and URL format for <Contoso> project |
| Вложенное расширение | Write an OData query with nested expand to return work items with their parent details in <Contoso> project |
| Сортировка и ограничение результатов | Create an OData query that returns the 20 most recently changed bugs ordered by changed date in <Contoso> project |
| Подсчет по типу рабочего элемента | Write an OData query that counts work items grouped by work item type for <Contoso> project |
| Фильтрация с помощью строковых функций | Create an OData query that returns work items whose title contains "login" in <Contoso> project |
| Совместите выбор, фильтрацию и расширение | Write an OData query that returns the title, state, assigned-to name, and iteration path for all user stories in the current sprint in <Contoso> project |